Asp.net-Mvc
使用多值鍵創建 RouteValueDictionary
我想返回一個
RedirectToRouteResult將使用者發送到如下 URL 的 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 } } };使這項工作的秘訣是什麼?
這是框架中真正缺少的一件事。你最好的選擇是手動滾動它:
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()); }將其放入自定義擴展方法當然可以增加可讀性。
在這種情況下,我什至不知道多次提供的鍵的名稱。而且由於查詢字元串確實接受多個鍵作為逗號分隔的列表。我發現根據 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; }