tag route net for data asp all c# asp.net-core asp.net-core-mvc

c# - route - Parámetro de cadena de consulta requerido en ASP.NET Core



tag helpers asp net core (4)

Deje que el marco haga el trabajo por usted. Aquí hay una solución, ya que parece que hay varias maneras de lograr lo mismo en ASP.NET Core. Pero esto es lo que funciona para mí y es bastante simple. Parece ser una combinación de algunas de las respuestas ya dadas.

public class QueryParameters { [Required] public int A { get; set; } public int B { get; set; } } [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values // [HttpGet] isn''t needed as it is the default method, but ok to leave in // QueryParameters is injected here, the framework takes what is in your query string and does its best to match any parameters the action is looking for. In the case of QueryParameters, you have A and B properties, so those get matched up with the a and b query string parameters public IEnumerable<string> Get(QueryParameters parameters) { if (!ModelState.IsValid) { return BadRequest(); // or whatever you want to do } return new [] { parameters.a.ToString(), parameters.b.ToString() }; } }

Usando ASP.NET Core 1.1 con VS2015 (sdk 1.0.0-preview2-003131), tengo el siguiente controlador:

public class QueryParameters { public int A { get; set; } public int B { get; set; } } [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable<string> Get([FromQuery]QueryParameters parameters) { return new [] { parameters.A.ToString(), parameters.B.ToString() }; } }

Como puede ver, tengo dos parámetros de consulta. Lo que me gustaría es tener uno de ellos (ej .: A ) que se requiera. Es decir, me gustaría utilizar un atributo (si es posible) para decir que este atributo es obligatorio. Entonces, me gustaría que ASP.NET haga esta validación incluso antes de llamar a mi controlador.

Me hubiera gustado utilizar Newtonsoft RequiredAttribute para usar los mismos atributos que ya uso para validar las propiedades requeridas en el contenido PUT / POST, pero como la url no es una cadena JSON, obviamente no se usa.

¿Alguna sugerencia de tener ASP.NET Core comprueba automáticamente los parámetros de consulta requeridos?

Tenga en cuenta que sé que puedo codificar la comprobación yo mismo usando parámetros de consulta con nulos, pero eso supera el propósito de permitir que ASP.NET haga la validación antes de llamar a mi controlador, manteniendo así mi controlador ordenado.


Puede considerar usar la función de vinculación del modelo del marco

De acuerdo con la documentación aquí: Personalice el comportamiento de enlace del modelo con los atributos

MVC contiene varios atributos que puede usar para dirigir su comportamiento de enlace de modelo predeterminado a una fuente diferente. Por ejemplo, puede especificar si se requiere el enlace para una propiedad, o si nunca debería pasar con los [BindRequired] o [BindNever] .

Por lo tanto, le sugiero que agregue un BindRequiredAttribute a la propiedad del modelo.

public class QueryParameters { [BindRequired] public int A { get; set; } public int B { get; set; } }

A partir de ahí, el marco debería ser capaz de manejar el estado del modelo de enlace y actualización para que pueda verificar el estado del modelo en la acción.

[Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IActionResult Get([FromQuery]QueryParameters parameters) { if(ModelState.IsValid) { return Ok(new [] { parameters.A.ToString(), parameters.B.ToString() }); } return BadRequest(); } }

La otra opción sería crear un archivador de modelo personalizado que dañe la acción si la cadena de consulta requerida no está presente.

Referencia: enlace de modelo personalizado


Use el enrutamiento de atributos y enumere cada parámetro requerido en el atributo HttpGet de la función.

[Route("api/[controller]")] public class ValuesController : Controller { [HttpGet("{A}")] public IEnumerable<string> Get(int A, int B) { return new [] { A.ToString(), B.ToString() }; } }

Esto requerirá, por ejemplo, / 5 y permitir / 5? B = 6 parámetros de consulta url.


Use la validación del modelo. Puede definir un ViewModel y usar DataAnnotations para marcar la propiedad A como [Obligatorio]. Luego, en su acción, simplemente verifique si ModelState.IsValid. También puede hacer esto fácilmente usando un filtro de acción como se muestra en este artículo: https://msdn.microsoft.com/en-us/magazine/mt767699.aspx