2012-02-15 23 views
14

创建RouteValueDictionary我想返回RedirectToRouteResult发送用户像下面这样的URL:与多值键

/MyController/MyAction/id?newid=3&newid=5&newid=7 

newid参数有几个值。

我的电话是这样的:return RedirectToAction(string.Empty, routeValues);

这里是我到目前为止已经试过,并且不工作:

// ...?newid%5B0%5D=3&newid%5B1%5D=5&newid%5B2%5D=7 
var routeValues = new RouteValueDictionary { 
    {"id", myid}, 
    {"newid[0]", 3}, 
    {"newid[1]", 5}, 
    {"newid[2]", 7}, 
}; 

// ...?newid=System.Int32%5B%5D 
var routeValues = new { id = myid, newid = new int[] { 3, 5, 7 } }; 

// ...?newid=System.String%5B%5D 
var routeValues = new { id = myid, newid = new string[] { "3", "5", "7" } }; 

// ...?newid=System.Int32%5B%5D 
var routeValues = new RouteValueDictionary { 
    {"id", myid}, 
    {"newid", new int[] { 3, 5, 7 } } 
}; 

的秘诀是什么,使这项工作?

回答

13

这是框架中真正缺少的一件事。最好的办法是手工把它卷:

public ActionResult Foo() 
{ 
    var ids = new[] { 3, 5, 7 }; 
    var url = new UriBuilder(Url.Action("MyAction", "MyController", new { id = "123" }, Request.Url.Scheme)); 
    url.Query = string.Join("&", ids.Select(x => "newid=" + HttpUtility.UrlEncode(x.ToString()))); 
    return Redirect(url.ToString()); 
} 

投入自定义扩展方法,这可能会增加课程的可读性。

+0

+1优雅的解决方案,Darin。 – 2012-02-15 15:08:16

+0

谢谢 - 作品太棒了! (它使测试更加困难 - 你必须嘲笑控制器的Context和UrlHelper - 但我想这就是它的方式。) – 2012-02-16 13:12:15

0

我是在这种情况下,我甚至不知道哪里提供多次密钥的名称。由于查询字符串确实接受多个键作为彗星分隔列表。我发现写一个基于Darin答案的扩展方法很有帮助。

public static UriBuilder TransformToMultiplyKeyUrl(this RouteValueDictionary self, string baseUrl) 
    { 
     var url = new UriBuilder(baseUrl); 
     //Transform x=y,z into x=y&x=z 
     url.Query = String.Join("&", 
      self.SelectMany(
       pair => ((string)pair.Value).Split(',') 
        .Select(v => String.Format("{0}={1}", pair.Key, HttpUtility.UrlEncode(v))))); 
     return url; 
    }