将数组传递给MVC控制器

时间:2017-10-19 14:58:59

标签: c# asp.net-mvc asp.net-core controller asp.net-mvc-routing

我想将一组ID传递给控制器​​。最初我在查询字符串中添加了每个ID,如下所示:

http://localhost:4000/customers/active?customerId=1&customerId=2&customerId=3

然后在控制器端我有一个接受这个数组的方法:

GetCustomers([FromQuery] int[] ids)
{
   ...
}

这样运行良好但是在某些情况下,数组中有如此多customerIds的查询字符串变得太长,所以我不得不修改查询传递给它的方式:< / p>

http://localhost:4000/customers/active?customerIds=1,2,3

我通过更改GetCustomers参数来接受字符串而不是int数组,然后在控制器中解析customerIds(使用.Split(',')

来解决问题

我觉得直接传递数组更简洁,而不必修改服务器端的字符串。考虑到customerIds现在被传递的方式,有没有办法实现这一目标?

3 个答案:

答案 0 :(得分:1)

1。使用POST

2。使用AJAX&amp;发送数据为JSON

 $.ajax({
           type: "POST",
           url: "/Home/GetCustomers",
           data : { stringOfCustomerIds : JSON.stringify(arrCustomerIds)},
           dataType: "json",
           success: function (response) {
                 //do something with the response
           }

&安培;在控制器方面

public JsonResult GetCustomers(string stringOfCustomerIds )
{
     JObject CustomerIdsJson = JObject.Parse(listOfCustomerIds );

       foreach (JProperty property in CustomerIdsJson .Properties())
       {
           Console.WriteLine(property.ID+ " - " + property.Value);
       }

      return Json(output, JsonRequestBehavior.AllowGet);  

}

答案 1 :(得分:1)

基于对[FromQuery]属性的使用,我可以确定您正在使用.NET Core(仅适用于此)。 [FromQuery]无法知道要映射到参数的查询字符串的哪一部分,因此必须提供一个Name参数,如下所示:

[FromQuery(Name ="ids")]

Name参数可以具有您想要的任何值。只要您的查询与您选择的名称匹配即可。因此,对于上面的示例:

?ids=2&ids=3&ids=4,但是如果要像

那样表达属性

[FromQuery(Name = "kittens")],则需要使查询看起来像

?kittens=2&kittens=3&kittens=4

按照这种方法,您将可以看到您的参数已正确填充。

答案 2 :(得分:0)

您可以使用前端的POST请求和后端控制器上的conda create -n renv -c r r=3.4.1 标记将ID作为JSON对象传递到邮件正文中。这样您的网址就会如下所示:[FromBody]无论邮件正文中有多少个ID。它还为您节省了将每个参数提取并推送到新数组元素的麻烦。