Asp.net-Mvc

使用多值鍵創建 RouteValueDictionary

  • February 27, 2015

我想返回一個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;
   }

引用自:https://stackoverflow.com/questions/9295180