ASP.NET MVC - Pass array object as a route value within Html.ActionLink(...) ASP.NET MVC - Pass array object as a route value within Html.ActionLink(...) arrays arrays

ASP.NET MVC - Pass array object as a route value within Html.ActionLink(...)


Try creating a RouteValueDictionary holding your values. You'll have to give each entry a different key.

<%  var rv = new RouteValueDictionary();    var strings = GetStringArray();    for (int i = 0; i < strings.Length; ++i)    {        rv["str[" + i + "]"] = strings[i];    } %><%= Html.ActionLink( "Link", "Action", "Controller", rv, null ) %>

will give you a link like

<a href='/Controller/Action?str=val0&str=val1&...'>Link</a>

EDIT: MVC2 changed the ValueProvider interface to make my original answer obsolete. You should use a model with an array of strings as a property.

public class Model{    public string Str[] { get; set; }}

Then the model binder will populate your model with the values that you pass in the URL.

public ActionResult Action( Model model ){    var str0 = model.Str[0];}


This really annoyed me so with inspiration from Scott Hanselman I wrote the following (fluent) extension method:

public static RedirectToRouteResult WithRouteValue(    this RedirectToRouteResult result,     string key,     object value){    if (value == null)        throw new ArgumentException("value cannot be null");    result.RouteValues.Add(key, value);    return result;}public static RedirectToRouteResult WithRouteValue<T>(    this RedirectToRouteResult result,     string key,     IEnumerable<T> values){    if (result.RouteValues.Keys.Any(k => k.StartsWith(key + "[")))        throw new ArgumentException("Key already exists in collection");    if (values == null)        throw new ArgumentNullException("values cannot be null");    var valuesList = values.ToList();    for (int i = 0; i < valuesList.Count; i++)    {        result.RouteValues.Add(String.Format("{0}[{1}]", key, i), valuesList[i]);    }    return result;}

Call like so:

return this.RedirectToAction("Index", "Home")           .WithRouteValue("id", 1)           .WithRouteValue("list", new[] { 1, 2, 3 });


Another solution that just came to my mind:

string url = "/Controller/Action?iVal=5&str=" + string.Join("&str=", strArray); 

This is dirty and you should test it before using it, but it should work nevertheless. Hope this helps.