如果收到的请求是BadRequest,我有一个逻辑申请,为此我创建了一个过滤器: public class ValidateModelAttribute : ActionFilterAttribute{ public override void OnActionExecuting(ActionExecutingContext context) { if (!cont
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
// Apply logic
}
}
}
在初创公司:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => { options.Filters.Add<ValidateModelAttribute>(); });
}
控制器:
[Route("api/[controller]")]
[ApiController]
public class VerifyController : ControllerBase
{
[Route("test")]
[HttpPost]
[ValidateModel]
public ActionResult<Guid> validationTest(PersonalInfo personalInfo)
{
return null;
}
}
模型:
public class PersonalInfo
{
public string FirstName { get; set; }
[RegularExpression("\\d{4}-?\\d{2}-?\\d{2}", ErrorMessage = "Date must be properly formatted according to ISO 8601")]
public string BirthDate { get; set; }
}
事情就是当我在线上设置一个断点时:
if (!context.ModelState.IsValid)
只有当我发送的请求有效时,执行才会到达此行.如果我发送错误请求,为什么不通过过滤器?
您应用于控制器的[ApiController]属性会向MVC管道添加“自动HTTP 400响应”,这意味着如果ModelState无效,则不会执行自定义过滤器和操作.您有几个选项可以影响其工作原理:
1.删除[ApiController]属性
虽然您可以删除[ApiController]属性,但这也会导致丢失其提供的某些其他功能,例如“绑定源参数推断”.
2.仅禁用自动HTTP 400响应
以下是docs中的示例,其中显示了如何禁用此功能:
services.Configure<ApiBehaviorOptions>(options =>
{
// ...
options.SuppressModelStateInvalidFilter = true;
});
此代码在Startup的ConfigureServices方法中.
3.自定义生成的自动响应
如果您只想为调用者提供自定义响应,则可以自定义返回的内容.我已经在另一个答案here中描述了它是如何工作的.
