Передача массива в строку запроса основного маршрута ASP.NET

Я хочу сделать этот, но я также хочу передать массивы в строку запроса. Я пробовал такие вещи, как:

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

И мой маршрут в коде С# выглядит так:

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

Но во всех этих случаях значения всегда равны нулю, когда они попадают в код С#. Для чего нужна строка запроса для передачи массива строк?

Ответ 1

В конце концов, я просто прошел в одной разделительной строке, а затем использовал string.Split для разделения на стороне сервера. Не самое приятное решение, но оно работает. Пока кто-то не найдет лучшего ответа, это все, что у меня есть. Я должен повторить, что я использую .NET Core, и эти строки запросов относятся к конкретным средам.

Ответ 2

Строка с разделителями не является стандартом. Подумайте также о клиенте, если вы поддерживаете чванство или другие генераторы.

Для тех, кто задается вопросом об ошибке.net core 2.1, которая получает пустой список, работа здесь: https://github.com/aspnet/Mvc/issues/7712#issuecomment-397003420

Для параметра FromQuery требуется параметр имени

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

Ответ 3

Используйте имя параметра в строке запроса. Если у вас есть действие:

public void DoSomething(string[] values)

Затем используйте values в строке запроса, чтобы передать массив на сервер:

?values=this&values=that

Ответ 4

Мне пришлось сделать что-то похожее на это, но вместо строк я использовал список long для передачи некоторого id для поиска. Используя параметр множественного выбора, выбранные значения отправляются методу (через get) следующим образом:

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

Я также использую Route("[controller]") перед объявлением класса. Работает нормально, но список элементов разбит на несколько параметров в URL-адресе, как показано ниже.

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

Ответ 5

Дано:

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

Следующий запрос будет работать:

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

Ответ 6

Я нашел две проблемы в вашем вопросе:

  1. Ваш запрос имеет параметры с именем arr то время как у вашего действия Contrller есть values.
  2. Я не знаю почему, но вы должны назвать свой параметр (как здесь ответили), чтобы Asp.NET ModelBinder мог работать как положено. Как это:
public void DoSomething([FromQuery(Name = "values")] string[] values)

После этого все должно работать как положено.

Ответ 7

Я нашел решение. Например, если у вас есть такой запрос, http://www.sitename.com/route?arr[]=this&arr[]=that. Вы должны определить в действии следующий код [FromQuery (Name = "arr []")]. Имя параметра должно быть в квадратных скобках "arr []". В результате мы можем увидеть:

public void DoSomething ([FromQuery (Name = "arr []")] string [] arr)