繁体   English   中英

如何将 Url.Action 与列表参数一起使用?

[英]How can I use Url.Action with list parameters?

说我有一个动作方法:

[HttpGet]
public ActionResult Search(List<int> category){
    ...
}

MVC 模型绑定的工作方式,它需要一个像这样的类别列表:

/search?category=1&category=2

所以我的问题是:

如果我只是硬编码,如何使用 Url.Action() 创建该链接?

Url.Action("Search", new {category=???}) //Expect: /search?category=1&category=2

如果我的输入是 int 列表,如何使用 Url.Action() 创建该链接?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM