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 Get
acción del controlador , el acceso HttpContext.Request.Query
devuelve 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 IQueryCollection
para 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
IQueryCollection
que devolverá el valor deseado sipage
se especifica un único parámetro:si hay varios valores como
?page=1&page=2
entonces, el resultado de la llamada ToString será1,2
Pero como sugirió @ mike-g en su respuesta, sería mejor usar el enlace de modelo y no acceder directamente al
HttpContext.Request.Query
objeto.fuente
ASP.NET Core se unirá de forma automática
form values
,route values
yquery strings
por 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
StringValues
es una matriz de cadenas . Puede obtener su valor de cadena proporcionando un índice, por ejemploHttpContext.Request.Query["page"][0]
.fuente
IQueryCollection
tiene 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
StringValues
tipo 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