Передача массива в строку запроса основного маршрута 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
Я нашел две проблемы в вашем вопросе:
- Ваш запрос имеет параметры с именем
arr
то время как у вашего действия Contrller есть values
. - Я не знаю почему, но вы должны назвать свой параметр (как здесь ответили), чтобы 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)