Hola, hemos encontrado la respuesta a lo que andabas buscando, deslízate y la encontrarás aquí.
Solución:
Cuando utilice un controlador con el ApiController
attribute aplicado, ASP.NET Core automáticamente maneja los errores de validación del modelo devolviendo una solicitud incorrecta 400 con ModelState
como cuerpo de respuesta. Como tal, su prueba condicional ModelState.IsValid
es esencialmente siempre false (y por lo tanto no ingresado) porque las únicas solicitudes que llegarán tan lejos son las válidas.
Simplemente puede quitar el ApiController
attributepero eso elimina un montón de otras cosas beneficiosas que attributes agrega también. La mejor opción es usar una fábrica de respuestas personalizada:
services.Configure(o =>
o.InvalidModelStateResponseFactory = actionContext =>
new BadRequestObjectResult(actionContext.ModelState);
);
Eso es esencialmente lo que sucede de forma predeterminada, por lo que simplemente necesita cambiar la acción proporcionada allí en consecuencia para personalizarla según sus caprichos.
Como analizó Chris, su problema se debe a las respuestas HTTP 400 automáticas.
Para una solución rápida, puede suprimir esta característica haciendo
services.AddMvc()
.ConfigureApiBehaviorOptions(options =>
options.SuppressModelStateInvalidFilter = true;
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
Para una manera eficiente, puede seguir la sugerencia de Chris, como a continuación:
services.AddMvc()
.ConfigureApiBehaviorOptions(options =>
//options.SuppressModelStateInvalidFilter = true;
options.InvalidModelStateResponseFactory = actionContext =>
var modelState = actionContext.ModelState.Values;
return new BadRequestObjectResult(FormatOutput(modelState));
;
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
Y, ya no es necesario definir el código a continuación en su acción.
if (!ModelState.IsValid)
return BadRequest(FormatOutput(ModelState.Values));
Si eres capaz, puedes dejar un post acerca de qué te ha parecido esta reseña.