Estoy creando una API RESTful usando ASP.NET Core MVC y quiero usar parámetros de cadena de consulta para especificar el filtrado y la paginación en un recurso que devuelve una colección.
En ese caso, necesito leer los valores pasados en la cadena de consulta para filtrar y seleccionar los resultados para devolver.
Ya descubrí que dentro de la Getacción del controlador , el acceso HttpContext.Request.Querydevuelve uno IQueryCollection.
El problema es que no sé cómo se usa para recuperar los valores. En verdad, pensé que la forma de hacerlo era usando, por ejemplo
string page = HttpContext.Request.Query["page"]
El problema es que HttpContext.Request.Query["page"]no devuelve una cadena, sino a StringValues.
De todos modos, ¿cómo se usa uno IQueryCollectionpara leer realmente los valores de la cadena de consulta?
fuente

Respuestas:
Puede usar
[FromQuery]para vincular un modelo particular a la cadena de consulta:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
p.ej
fuente
[FromQuery]atributo también se puede omitir, ya que el enlace .net verificará todas las entradas de formulario y los parámetros de cadena de consulta de URL de forma predeterminada, excepto que tiene alguna razón para limitar su fuente.Puede usar el método ToString en el
IQueryCollectionque devolverá el valor deseado sipagese especifica un único parámetro:si hay varios valores como
?page=1&page=2entonces, el resultado de la llamada ToString será1,2Pero como sugirió @ mike-g en su respuesta, sería mejor usar el enlace de modelo y no acceder directamente al
HttpContext.Request.Queryobjeto.fuente
ASP.NET Core se unirá de forma automática
form values,route valuesyquery stringspor su nombre. Esto significa que simplemente puede hacer esto:Fuente: Cómo funciona el enlace de modelos
Para su información, también puede combinar los enfoques automático y explícito:
fuente
Simplemente puede crear un objeto como este:
Y luego en el controlador solo haz algo así:
Aún mejor, puede crear un modelo API a partir de:
a:
fuente
Aquí hay una muestra de código que he usado (con una vista de .NET Core):
fuente
StringValueses una matriz de cadenas . Puede obtener su valor de cadena proporcionando un índice, por ejemploHttpContext.Request.Query["page"][0].fuente
IQueryCollectiontiene unTryGetValue()valor que devuelve un valor con la clave dada. Entonces, si tuviera un parámetro de consulta llamadosomeInt, podría usarlo así:Tenga en cuenta que a menos que tenga varios parámetros del mismo nombre, el
StringValuestipo no es un problema.fuente
en .net core si desea acceder a la cadena de consulta en nuestra vista, úsela como
si estamos en una ubicación donde @Context no está disponible, podemos inyectarlo como
también para galletas
fuente
Tengo una mejor solución para este problema,
var searchparams = await Request.GetSearchParams();He creado una clase estática con pocos métodos de extensión.
De esta manera puede acceder fácilmente a todos sus parámetros de búsqueda. Espero que esto ayude a muchos desarrolladores :)
fuente
Algunos de los comentarios mencionan esto también, pero asp net core hace todo este trabajo por usted.
Si tiene una cadena de consulta que coincide con el nombre, estará disponible en el controlador.
https: // myapi / some-endpoint / 123? someQueryString = YayThisWorks
Ouputs:
123
YayThisWorks
fuente