使用List作为使用MVC的查询字符串参数

时间:2010-08-26 18:05:34

标签: .net list asp.net-mvc-2 query-string

我有一个看起来像这样的动作方法:

public ActionResult DoSomething(string par, IEnumerable<string> mystrings)

我想使用Url.Action将此映射到URL,并在RouteValueDictionary中传递mystrings。但是,这只会产生一个只对应于mystrings.ToString()。

的查询字符串

如何在查询字符串中传递列表? MVC 2中是否有一些支持此功能的功能?

澄清:使用GET调用action方法,而不是POST。

我的动作方法解析查询字符串DoSomething没有问题吗?mystrings = aaa&amp; mystrings = bbb

但是,我无法使用Url.Action生成此内容。传递列表会生成以下查询字符串:mystrings = system.collections.generic.list%601%5bsystem.string%5d

有什么方法可以轻松完成这个任务吗?

3 个答案:

答案 0 :(得分:2)

是。 Model Binding To A List

编辑:好的,现在我知道你要去哪里了。我不认为ASP.NET MVC具有内置功能,因为它旨在从具有唯一名称的路由值生成查询字符串。你可能需要自己动手。我会在IEnumerable<String>上创建一个扩展方法,如下所示:

public static class Extensions
{
    public static string ToQueryString(this IEnumerable<string> items)
    {
        return items.Aggregate("", (curr, next) => curr + "mystring=" + next + "&");
    }
}

然后你可以像这样生成自己的查询字符串:

<%= Url.Action("DoSomething?" + Model.Data.ToQueryString()) %>

这需要一些改进,因为你应该对你的字符串进行UrlEncode并创建一个尾随的“&amp;”,但这应该给你基本的想法。

答案 1 :(得分:1)

怎么样:

<%: Html.ActionLink("foo", "DoSomething", new RouteValueDictionary() { 
    { "mystrings[0]", "aaa" }, { "mystrings[1]", "bbb" } 
}) %>

生成:

<a href="/Home/DoSomething?mystrings%5B0%5D=aaa&amp;mystrings%5B1%5D=bbb">foo</a>

这不完全是您要查找的网址,但它会成功绑定到您的控制器操作。如果你想生成一个没有方括号的网址,你需要自己编写帮助方法。

答案 2 :(得分:0)

public static class Extensions
{
  public static string ToQueryString(this IEnumerable<string> items)
  {
     if (items.Count>0)
     {
          var urlParam = string.Join("&", items.ToArray());
          return "?"+ urlParam;
     }
     return "";
  }
}