tag net mvc asp c# http asp.net-core query-string .net-core

c# - mvc - tag helper asp net core 2



¿Cómo leer valores de la cadena de consulta con ASP.NET Core? (8)

Estoy construyendo 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 del controlador Get acción accediendo a HttpContext.Request.Query devuelve una 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 un StringValues .

De todos modos, ¿cómo se usa IQueryCollection para leer realmente los valores de la cadena de consulta?


ASP.NET Core enlazará automáticamente los form values , los route values y las query strings por nombre. Esto significa que simplemente puede hacer esto:

[HttpGet()] public IActionResult Get(int page) { ... }

MVC intentará vincular los datos de la solicitud a los parámetros de acción por nombre ... a continuación hay una lista de las fuentes de datos en el orden en que el enlace del modelo los revisa

  1. Form values : estos son valores de formulario que van en la solicitud HTTP utilizando el método POST. (incluidas las solicitudes jQuery POST).

  2. Route values : el conjunto de valores de ruta proporcionados por Enrutamiento

  3. Query strings : la parte de la cadena de consulta del URI.

Fuente: cómo funciona el enlace de modelos

Para su información, también puede combinar los enfoques automático y explícito:

[HttpGet()] public IActionResult Get(int page , [FromQuery(Name = "page-size")] int pageSize) { ... }


Aquí hay una muestra de código que he usado (con una vista de .NET Core):

@{ Microsoft.Extensions.Primitives.StringValues queryVal; if (Context.Request.Query.TryGetValue("yourKey", out queryVal) && queryVal.FirstOrDefault() == "yourValue") { } }



Puede usar el método ToString en IQueryCollection que devolverá el valor deseado si se especifica un único parámetro de page :

string page = HttpContext.Request.Query["page"].ToString();

si hay múltiples 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 objeto HttpContext.Request.Query .


Simplemente puede crear un objeto como este:

public class SomeQuery { public string SomeParameter { get; set; } public int? SomeParameter2 { get; set; } }

Y luego en el controlador solo haz algo así:

[HttpGet] public IActionResult FindSomething([FromQuery] SomeQuery query) { // Your implementation goes here.. }

Aún mejor, puede crear un modelo API a partir de:

[HttpGet] public IActionResult GetSomething([FromRoute] int someId, [FromQuery] SomeQuery query)

a:

[HttpGet] public IActionResult GetSomething(ApiModel model) public class ApiModel { [FromRoute] public int SomeId { get; set; } [FromQuery] public string SomeParameter { get; set; } [FromQuery] public int? SomeParameter2 { get; set; } }


en .net core si desea acceder a la cadena de consulta en nuestra vista, úsela como

@Context.Request.Query["yourKey"]

si estamos en una ubicación donde @Context no está disponible, podemos inyectarlo como

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor @if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey")) { <text>do something </text> }

también para galletas

HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]


IQueryCollection tiene un TryGetValue() que devuelve un valor con la clave dada. Entonces, si tuviera un parámetro de consulta llamado someInt , podría usarlo así:

var queryString = httpContext.Request.Query; StringValues someInt; queryString.TryGetValue("someInt", out someInt); var daRealInt = int.Parse(someInt);

Tenga en cuenta que a menos que tenga varios parámetros del mismo nombre, el tipo StringValues no es un problema.


StringValues es una matriz de cadenas . Puede obtener su valor de cadena proporcionando un índice, por ejemplo, HttpContext.Request.Query["page"][0] .