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
Form values
: estos son valores de formulario que van en la solicitud HTTP utilizando el método POST. (incluidas las solicitudes jQuery POST).
Route values
: el conjunto de valores de ruta proporcionados por Enrutamiento
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
[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
[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}
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]
.