Asp.net-Mvc-3

將數組傳遞給 RouteValues 並讓它呈現模型綁定器友好的 url

  • April 5, 2017

當將一個RouteValueDicitonary或匿名對像傳遞給 @Url.Action 方法(或其任何類似方法)時,有沒有辦法正確傳遞一個集合對象,或者IEnumerable它會生成一個與預設模型綁定器兼容的 url?

例如,假設我有這樣的動作:

public ActionResult Index(ICollection<int> ids)
 {
   ...do something
 }

在我的模板中,我做了這樣的事情:

@Url.Action("Index", routeValues:new int[]{1,2,3})

目標是有一個這樣的 url 輸出:

... /index?ids=1&ids=2&ids=3

但 url 輸出實際上是這樣的:

... /index?ids=System.Int[]

我假設目前沒有對此的支持。如果不是,那麼我需要在 MVC 的哪個部分創建自定義處理程序或其他任何內容來覆蓋此預設功能?

不幸的是,目前沒有現有的幫助程序可以讓您生成這樣的 url。所以一種可能性是手動完成:

@(Url.Action("Index") + "?" + string.Join("&", new int[] { 1, 2, 3 }.Select(x => "ids=" + x)))

或者寫一個擴展方法來封裝邏輯:

@Url.ActionWithIds("Index", new int[] { 1, 2, 3 })

由於這些是整數,我們不需要 url 編碼,但如果你想對字元串集合做同樣的事情,那麼值應該正確 url 編碼。

RouteValueDictionary出於往返目的,使用模型綁定語法將數組的每個元素傳遞給 a 。

int i = 0;
var temprvd = arr.ToDictionary(m => String.Format("name[{0}]", i++), m => (object) m);
@Url.Action("index", new RouteValueDictionary(temprvd));

或連接到現有的路由值字典。

將值轉換為object(如上所示)以確保使用正確的RouteValueDictionary建構子重載。

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