Я создаю один RESTful API, используя ASP.NET Core MVC, и хочу использовать параметры строки запроса, чтобы указать фильтрацию и разбиение на страницы для ресурса, возвращающего коллекцию.
В этом случае мне нужно прочитать значения, переданные в строке запроса, для фильтрации и выбрать результаты для возврата.
Я уже выяснил, что внутри Get
действия контроллера обращение к нему HttpContext.Request.Query
возвращает IQueryCollection
.
Проблема в том, что я не знаю, как он используется для получения значений. По правде говоря, я думал, что можно использовать, например,
string page = HttpContext.Request.Query["page"]
Проблема в том, что HttpContext.Request.Query["page"]
возвращает не строку, а StringValues
.
В любом случае, как можно использовать IQueryCollection
для фактического чтения значений строки запроса?
источник
Ответы:
Вы можете использовать
[FromQuery]
для привязки конкретной модели к строке запроса:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
например
источник
[FromQuery]
атрибут attrib также можно опустить, поскольку привязка .net будет проверять все входные данные формы и параметры строки запроса URL по умолчанию, за исключением того, что у вас есть причина ограничить его источник.Вы можете использовать метод ToString,
IQueryCollection
который вернет желаемое значение, еслиpage
указан единственный параметр:если есть несколько значений, например,
?page=1&page=2
тогда результат вызова ToString будет1,2
Но, как предположил @ mike-g в своем ответе, вам лучше использовать привязку модели, а не напрямую обращаться к
HttpContext.Request.Query
объекту.источник
ASP.NET ядро будет автоматически связываться
form values
,route values
иquery strings
по имени. Это означает, что вы можете просто сделать это:Источник: Как работает привязка модели
К вашему сведению, вы также можете комбинировать автоматический и явный подходы:
источник
Вы можете просто создать такой объект:
А затем в контроллере просто сделайте что-то вроде этого:
Более того, вы можете создать модель API из:
чтобы:
источник
Вот пример кода, который я использовал (с представлением .NET Core):
источник
StringValues
представляет собой массив строк . Вы можете получить строковое значение, указав индекс, напримерHttpContext.Request.Query["page"][0]
.источник
IQueryCollection
имеетTryGetValue()
на нем, который возвращает значение с заданным ключом. Итак, если у вас есть параметр запросаsomeInt
, вы можете использовать его так:Обратите внимание: если у вас нет нескольких параметров с одним и тем же именем,
StringValues
тип не является проблемой.источник
в ядре .net, если вы хотите получить доступ к строке запроса в нашем представлении, используйте ее как
если мы находимся в месте, где @Context недоступен, мы можем ввести его, например
также для файлов cookie
источник
У меня есть лучшее решение этой проблемы,
var searchparams = await Request.GetSearchParams();
Я создал статический класс с несколькими методами расширения
таким образом вы можете легко получить доступ ко всем параметрам поиска. Надеюсь, это поможет многим разработчикам :)
источник
В некоторых комментариях это тоже упоминается, но ядро asp net делает всю эту работу за вас.
Если у вас есть строка запроса, соответствующая имени, она будет доступна в контроллере.
https: //? MyAPI / некоторые конечная точка / 123 someQueryString = YayThisWorks
Выходы:
123
YayThisWorks
источник