作者:十分风格的功夫_723 | 来源:互联网 | 2022-12-07 15:58
如果收到的请求是BadRequest,我有一个逻辑可以应用,为此我创建了一个过滤器:
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(); });
}
控制器:
[Route("api/[controller]")]
[ApiController]
public class VerifyController : ControllerBase
{
[Route("test")]
[HttpPost]
[ValidateModel]
public ActionResult 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)
仅当我发送的请求有效时,执行才会到达此行。如果我发送了错误的请求,为什么它没有通过过滤器?
1> Kirk Larkin..:
[ApiController]
您要应用于控制器的属性会将“自动HTTP 400响应”添加到MVC管道,这意味着自定义过滤器和操作将在ModelState
无效时不执行。您可以通过几种方法来影响其工作方式:
1.删除[ApiController]
属性
尽管您只能删除该[ApiController]
属性,但这也会导致其提供的其他一些功能丢失,例如“绑定源参数推断”。
2. 仅禁用自动HTTP 400响应
这是文档中的示例,显示了如何仅禁用此功能:
services.Configure(optiOns=>
{
// ...
options.SuppressModelStateInvalidFilter = true;
});
该代码位于您Startup
的ConfigureServices
方法中。
3.自定义生成的自动响应
如果只想向调用者提供自定义响应,则可以自定义返回的内容。我已经在这里的另一个答案中描述了它是如何工作的。