Parámetro de cadena de consulta requerido en ASP.NET Core

Al usar 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 Get([FromQuery]QueryParameters parameters) { return new [] { parameters.A.ToString(), parameters.B.ToString() }; } } 

Como puedes ver, tengo dos parámetros de consulta. Lo que me gustaría es tener uno de ellos (por ejemplo: A ) para ser requerido. Es decir, me gustaría usar un atributo (si es posible) para decir que este atributo es obligatorio. Entonces, me gustaría que ASP.NET haga esta validación antes de llamar a mi controlador.

Me hubiera gustado usar 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 para que ASP.NET Core compruebe automáticamente los parámetros de consulta requeridos?

Tenga en cuenta que sé que puedo progtwigr la comprobación yo mismo utilizando parámetros de consulta que puedan contener nulos, pero que supera el propósito de dejar que ASP.NET haga la validación antes de llamar a mi controlador, por lo que mantengo mi controlador ordenado.

Puede considerar el uso de la función de enlace de modelo del marco

De acuerdo con la documentación aquí: Personalizar el comportamiento del enlace del modelo con 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 la vinculación es necesaria para una propiedad, o si nunca debería suceder utilizando 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; } } 

Desde allí, el marco debe poder 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 podría fallar en la acción si la cadena de consulta requerida no está presente.

Referencia: Encuadernación de modelo personalizado

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

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

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

Deja que el framework haga el trabajo por ti. Aquí hay una solución, ya que parece que hay varias formas 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 Get(QueryParameters parameters) { if (!ModelState.IsValid) { return BadRequest(); // or whatever you want to do } return new [] { parameters.a.ToString(), parameters.b.ToString() }; } } 

Utilice la validación del modelo. Puede definir un ViewModel y usar DataAnnotations para marcar la propiedad A como [Requerido]. 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