URL.Action与字符串数组?

时间:2012-12-14 23:16:27

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework razor

我有一个字符串数组,我需要在Url.Action的查询字符串中传递。

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

现在,链接在我的浏览器中显示为System.String []而不是查询字符串。是否有可能让MVC通过模型绑定自动执行此操作?

我需要它与我的控制器动作绑定,如:

public ActionResult Index(string[] formatIDs)

3 个答案:

答案 0 :(得分:10)

要使用默认绑定器获取要自动绑定的字符串列表,您需要将它们提供为:

name=value&name=value2&name=value3

因此,您需要将列表转换为:

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

答案 1 :(得分:7)

要使用默认的模型绑定器,您最终应该使用以下内容:

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

你可以返回一个名为HttpValueCollection的私有集合,即使文档说它是使用ParseQueryString实用程序的NameValueCollection。 然后手动添加密钥,HttpValueCollection为您执行编码。 然后手动附加QueryString:

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

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

答案 2 :(得分:0)

还有另一种方法将RouteValueDictionary与数组一起使用:

@{
   var parameters = new RouteValueDictionary();

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

用法:

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

仍然不是很优雅 - 但工作。