将数组传递到ASP.NET核心路由查询字符串

时间:2017-04-13 16:56:06

标签: c# asp.net-core query-string

我想做this,但我也希望能够将数组传递到查询字符串中。我尝试过这样的事情:

http://www.sitename.com/route?arr[]=this&arr[]=that
http://www.sitename.com/route?arr[]=this&that
http://www.sitename.com/route?arr[0]=this&arr[1]=that
http://www.sitename.com/route?arr0=this&arr1=that
http://www.sitename.com/route?arr=this&arr=that

我在C#代码中的路径如下所示:

[Route("route")]
[HttpGet]
public void DoSomething(string[] values)
{
    // ...
}

但在所有这些情况下,当它到达C#代码时,值始终为null。我需要什么查询字符串来传递字符串数组?

8 个答案:

答案 0 :(得分:14)

带分隔符的字符串不是标准的。如果支持swagger或其他生成器,也请考虑客户端。

对于那些想知道收到一个空列表的.net core 2.1错误的人,这里的解决方法是:https://github.com/aspnet/Mvc/issues/7712#issuecomment-397003420

在FromQuery上需要一个名称参数

[FromQuery(Name = "employeeNumbers")] List<string> employeeNumbers

答案 1 :(得分:11)

在查询字符串中使用参数名称。如果你有行动:

public void DoSomething(string[] values)

然后在查询字符串中使用values将数组传递给服务器:

?values=this&values=that

答案 2 :(得分:4)

我必须做类似的事情,但是我使用了一个long列表来传递一些id进行搜索,而不是字符串。使用多选选项,所选值将发送到方法(通过get),如下所示:

[HttpGet("[action]")]
public IActionResult Search(List<long> idsSelected)
{
    ///do stuff here
}

我也在类声明之前使用Route("[controller]")。工作得很好,但项目列表在网址中分为多个参数,如下所示。

http://localhost:5000/Search/idsSelected=1&idsSelected=2

答案 3 :(得分:4)

我在您的问题中发现了两个问题:

  1. 您的查询的参数有名为arr的参数,而Contrller的操作中有values的参数。
  2. 我不知道为什么,但是您必须命名参数(as answered here),以便Asp .NET ModelBinder可以按预期工作。像这样:
public void DoSomething([FromQuery(Name = "values")] string[] values)

这样做之后,一切都会按预期进行。

答案 4 :(得分:2)

假设:

public ValuesController
{
    public IACtionResult Get([FromUri]string[] arr)
    {
        Return Ok(arr.Length);
    }
}

以下请求将起作用:

GET /api/values/?arr[0]=a&arr[1]=b&arr[2]=c

答案 5 :(得分:2)

在尝试传递字符串Array时,.NET Core 3存在相同的问题。我通过将查询参数作为临时json字符串传入来解决了该问题。然后,我使用Newtonsoft的Json包

将字符串反序列化为结果数组
using Newtonsoft.Json;

public IActionResult Get([FromQuery(Name = "array")] string arrayJson)
{
    List<string> array = JsonConvert.DeserializeObject<List<string>>(arrayJson);
}

答案 6 :(得分:1)

我找到了解决方案。例如,如果您有一个类似http://www.sitename.com/route?arr[]=this&arr[]=that的查询。 您必须在操作中定义下一个代码[FromQuery(Name =“ arr []”)]。参数名称必须带有方括号“ arr []”。结果,我们可以看到:

公共无效DoSomething([FromQuery(Name =“ arr []”)]字符串[] arr)

答案 7 :(得分:0)

最后,我只传入一个分隔的字符串,然后使用string.Split在服务器端分离。不是最漂亮的解决方案,但它确实有效。直到有人想出更好的答案,这就是我得到的全部。我应该重申,我使用的是.NET Core,这些查询字符串是特定于框架的。