2012-02-15 58 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; 
    }