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)
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
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
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.