ASP.NET MVC - 将数组对象作为Html.ActionLink(...)中的路由值传递

39 arrays asp.net-mvc routes actionlink

我有一个返回数组(string [])的方法,我试图将这个字符串数组传递给一个Action Link,这样它就会创建一个类似于的查询字符串:

/Controller/Action?str=val1&str=val2&str=val3...etc
Run Code Online (Sandbox Code Playgroud)

但是当我传递新的{str = GetStringArray()}时,我得到以下网址:

/Controller/Action?str=System.String%5B%5D
Run Code Online (Sandbox Code Playgroud)

所以基本上它采用我的字符串[]并在其上运行.ToString()来获取值.

有任何想法吗?谢谢!

tva*_*son 13

尝试创建一个包含值的RouteValueDictionary.您必须为每个条目指定一个不同的密钥.

<%  var rv = new RouteValueDictionary();
    var strings = GetStringArray();
    for (int i = 0; i < strings.Length; ++i)
    {
        rv["str[" + i + "]"] = strings[i];
    }
 %>

<%= Html.ActionLink( "Link", "Action", "Controller", rv, null ) %>
Run Code Online (Sandbox Code Playgroud)

会给你一个像这样的链接

<a href='/Controller/Action?str=val0&str=val1&...'>Link</a>
Run Code Online (Sandbox Code Playgroud)

编辑:MVC2更改了ValueProvider接口,使我原来的答案过时了.您应该使用带有字符串数组的模型作为属性.

public class Model
{
    public string Str[] { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,模型绑定器将使用您在URL中传递的值填充模型.

public ActionResult Action( Model model )
{
    var str0 = model.Str[0];
}
Run Code Online (Sandbox Code Playgroud)

  • @tvanfosson:我相信是的,是的.将`new {foo = new [] {"a","b"}}`等路由数据传递给`Html.ActionLink`,`Url.Action`,`HtmlHelper.GenerateLink`等任何一个都会产生一个查询字符串参数如`?foo = System.String%5B%5D`,而不是预期的`?foo = a&foo = b`.如果指定html属性,会得到不同的结果吗? (4认同)
  • 模型绑定不是问题.当`RouteValueDictionary`值包含数组/列表/等时,MVC 2似乎仍然生成查询字符串,如`?str = System.String%5B%5D`.还是没办法吗? (2认同)

Gre*_*ean -7

我会使用 POST 来存储数组。除了丑陋和滥用 GET 之外,您还面临着耗尽 URL 空间的风险(信不信由你)。

假设限制为 2000 字节。查询字符串开销 (&str=) 将实际数据减少到约 300 字节(假设 url 的其余部分为 0 字节)。