URL.Action with a string array?

2019-06-16 06:11发布

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)

3条回答
在下西门庆
2楼-- · 2019-06-16 06:37

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
查看更多
爷的心禁止访问
3楼-- · 2019-06-16 06:40

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.

查看更多
\"骚年 ilove
4楼-- · 2019-06-16 06:59

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
查看更多
登录 后发表回答