我想做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。我需要什么查询字符串来传递字符串数组?
答案 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)
我在您的问题中发现了两个问题:
arr
的参数,而Contrller的操作中有values
的参数。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,这些查询字符串是特定于框架的。