2012-12-14 45 views
9

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

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

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

我需要用它来像我控制器操作绑定:

public ActionResult Index(string[] formatIDs) 
+1

你期望输出看起来像什么? –

+0

我需要它与我的控制器动作绑定,如下所示: public ActionResult Index(string [] formatIDs) – user547794

+0

查询字符串通常不是执行此操作的最佳方法。 –

回答

7

要获取字符串列表中使用默认的粘结剂自动绑定,您将需要为他们提供为:

name=value&name=value2&name=value3 

所以你需要将你的列表转换为类似的东西:

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

默认模型联编程序+1,即正确的安装程序。非常好的Queti。 –

+8

这不回答问题。他希望Url.Action将正确的数组路由值输出到查询字符串。他不问如何约束这样的价值。 – Sam

6

对于使用默认的模型联编程序,您应该结束了,像这样:

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

可以返回名为私人收藏HttpValueCollection即使文件说,这是使用ParseQueryString实用程序的NameValueCollection。 然后手动添加密钥,HttpValueCollection为您执行编码。 然后只是追加手动查询字符串:

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

Url.Action("Index", "Resource")[email protected] 
+0

您的建议有效。但是我想知道为什么从剃须刀视图发送一个字符串数组到一个MVC控制器操作仍然如此奇怪和复杂。 – Sven

+0

因为通常情况下,你应该使用get动词的形式HTML元素,一切都将平滑和简单。 –

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))'; 

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

相关问题