URL.Action with a string array?

2019-06-16 06:46发布

问题:

I have an array of strings that I need to pass in a query string of Url.Action.

Url.Action("Index", "Resource", new { FormatIds = Model.FormatIDs})

Right now the link is showing up in my browser as System.String[] instead of a query string. Is it possible to have MVC do this automatically with model binding?

I need it to bind with my controller action like:

public ActionResult Index(string[] formatIDs)

回答1:

To get the list of string to automatically bind using the default binder, you will need to provide them as:

name=value&name=value2&name=value3

So you'll need to convert your list to something like:

Index?formatIDs=1&formatIDs=2&formatIDs=3


回答2:

For use the default model binder, you should end up with something like :

Index?formatIDs=value1&formatIDs=value2&formatIDs=value3

you can returns a private collection named HttpValueCollection even the documentation says it's a NameValueCollection using the ParseQueryString utility. Then add the keys manually, HttpValueCollection do the encoding for you. And then just append the QueryString manually :

var qs = HttpUtility.ParseQueryString(""); 
new string[] { "value1", "value2", "value3" }.ToList().ForEach(x => qs.Add("formatIDs", x));

Url.Action("Index", "Resource")?@qs


回答3:

There is another way using the RouteValueDictionary with an array:

@{
   var parameters = new RouteValueDictionary();

   for (var i = 0; i < Model.CustomList.Count; ++i)
   {
       parameters.Add($"customListId[{i}]", Model.CustomList[i]);
   }
}

usage:

var url = '@Html.Raw(Url.Action("ControllerActioon", "Controller", parameters))';

Still not very elegant - but working.