C# ASP.NET核心:自定义验证 背景
我有一个用asp.net core v2.1编写的web api。这是我的服务公开的功能:C# ASP.NET核心:自定义验证 背景,c#,asp.net,asp.net-core,asp.net-core-2.1,C#,Asp.net,Asp.net Core,Asp.net Core 2.1,我有一个用asp.net core v2.1编写的web api。这是我的服务公开的功能: [HttpPost] [Route("submit")] public async Task<ActionResult<int>> DoIt(CustomModel model) { if (!ModelState.IsValid) return new StatusCodeResult(403); // Custom 403 will be here.
[HttpPost]
[Route("submit")]
public async Task<ActionResult<int>> DoIt(CustomModel model)
{
if (!ModelState.IsValid)
return new StatusCodeResult(403); // Custom 403 will be here.
// ...
}
这种组合(方法+模型)工作正常,直到客户端不向服务器提供MagicNumber
问题
与旧的asp.net(.net framework)不同,当模型验证失败时,会自动向客户端发送403错误消息
我希望防止这种默认行为,并向用户提供自定义错误消息。我更喜欢这样定义自定义响应:
[HttpPost]
[Route("submit")]
public async Task<ActionResult<int>> Submit(CustomModel model)
{
if (!ModelState.IsValid)
return new CustomErrorCode_BadRequest();
//...
}
添加这行代码后,我能够访问我的if(!ModelState.IsValid)
语句。在此之前,请求在前面的步骤中被阻止。不幸的是,ModelState.IsValid
总是返回true
(无论输入是什么)。我猜这是因为我“清除”了所有的验证器——这听起来是个坏主意
应该怎么做
谢谢 感谢@compufaker(来源:)将此代码添加到Starup.cs
解决了以下问题:
services.Configure<ApiBehaviorOptions>(opt =>
{
opt.SuppressModelStateInvalidFilter = true;
});
services.Configure(opt=>
{
opt.SuppressModelStateInvalidFilter=true;
});
这有帮助吗?你的类中有[ApiController]属性吗?可能是@Compufreak的重复-是!这就解决了问题。谢谢你的帮助!可能重复的
services.AddMvc(options => options.ModelValidatorProviders.Clear());
services.Configure<ApiBehaviorOptions>(opt =>
{
opt.SuppressModelStateInvalidFilter = true;
});