我正在使用ASP.NET Core MVC 2.0实现REST API项目,如果模型绑定失败(因为请求语法错误)和422状态,我想返回400状态代码代码如果模型验证失败(因为请求在语法上是正确的但包含不可接受的值)。
举个例子,给出像
这样的动作[HttpPut("{id}")]
public async Task<IActionResult> UpdateAsync(
[FromRoute] int id,
[FromBody] ThingModel model)
当路由中的id
参数包含非数字字符或者在请求中未指定正文时,我想返回400状态代码,当属性中有422状态代码时,我想返回400状态代码ThingModel
包含无效值。
从我所看到的IValueProvider
和IModelBinder
实施中,我们将错误添加到请求的ModelStateDictionary
,就像验证器一样,并且没有办法在绑定和验证之间注入代码。
我该如何实现这样的行为?
答案 0 :(得分:1)
尚未检查选项#1,但是:
ApiBehaviorOptions的快速注释:
因此,在某些情况下,自定义过滤器是更好的解决方案(更改较少)。
答案 1 :(得分:0)
在项目中添加以下属性
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
if (!context.ModelState.IsValid)
context.Result = new BadRequestObjectResult(new
{
message = context.ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))
});
}
}
像这样改变你的api
[HttpPut("{id}")]
[ValidateModel]
public async Task<IActionResult> UpdateAsync(
[FromRoute] int id,
[FromBody] ThingModel model)
id
包含非数字=&gt; 400
model
未在=&gt;内传递注释验证400
如果您想在模型中使用422
代码拒绝不可接受的值,请在您的控制器中实现