[英]How can I use Url.Action with list parameters?
說我有一個動作方法:
[HttpGet]
public ActionResult Search(List<int> category){
...
}
MVC 模型綁定的工作方式,它需要一個像這樣的類別列表:
/search?category=1&category=2
所以我的問題是:
Url.Action("Search", new {category=???}) //Expect: /search?category=1&category=2
var categories = new List<int>(){1,2}; //Expect: /search?category=1&category=2
Url.Action("Search", new {category=categories}) //does not work,
不使用匿名類型,而是構建一個RouteValueDictionary
。 將參數格式化為parameter[index]
。
@{
var categories = new List<int>() { 6, 7 };
var parameters = new RouteValueDictionary();
for (int i = 0; i < categories.Count; ++i)
{
parameters.Add("category[" + i + "]", categories[i]);
}
}
然后,
@Url.Action("Test", parameters)
自己構建查詢字符串,很明顯 UrlHelper 不是為這個用例設計的。
使用:
static class QueryStringBuilder {
public static string ToQueryString(this NameValueCollection qs) {
return ToQueryString(qs, includeDelimiter: false);
}
public static string ToQueryString(this NameValueCollection qs, bool includeDelimiter) {
var sb = new StringBuilder();
for (int i = 0; i < qs.AllKeys.Length; i++) {
string key = qs.AllKeys[i];
string[] values = qs.GetValues(key);
if (values != null) {
for (int j = 0; j < values.Length; j++) {
if (sb.Length > 0)
sb.Append('&');
sb.Append(HttpUtility.UrlEncode(key))
.Append('=')
.Append(HttpUtility.UrlEncode(values[j]));
}
}
}
if (includeDelimiter && sb.Length > 0)
sb.Insert(0, '?');
return sb.ToString();
}
}
你可以這樣寫:
var parameters = new NameValueCollection {
{ "category", "1" },
{ "category", "2" }
};
var url = Url.Action("Search") + parameters.ToQueryString(includeDelimiter: true);
而是將類型轉換為“object”或“object[]”或使用 RouteValueDictionary。 實現相同目標的一種簡單方法是使用“Newtonsoft.Json”
如果使用 .Net Core 3.0 或更高版本;
默認使用內置的 System.Text.Json 解析器實現。
@using System.Text.Json;
…….
@Url.Action(“ActionName”, “ControllerName”, new {object = JsonConvert.SerializeObject(‘@ModalObject’) }))
如果使用 .Net Core 2.2 或更早版本卡住;
默認使用 Newtonsoft JSON.Net 作為您的首選 JSON 解析器。
@using Newtonsoft.Json;
…..
@Url.Action(“ActionName”, “ControllerName”, new {object = JsonConvert.SerializeObject(‘@ModalObject’) }))
您可能需要先安裝該軟件包。
PM> Install-Package Newtonsoft.Json
然后,
public ActionResult ActionName(string modalObjectJSON)
{
Modal modalObj = new Modal();
modalObj = JsonConvert.DeserializeObject<Modal>(modalObjectJSON);
}
這不是最好的方法,但您可以使用 QueryString 參數名稱加入類別列表。
@Url.Action("Search", new {category = string.Join("&category=", categories)});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.