我有一个.NET Core项目。我正在使用视图模型来绑定来自请求的传入数据。
在视图模型中,我正在进行数据注释[Required]
验证。如果该特定字段的数据为空,则执行从那里返回而不传递给控制器。
我需要执行转到控制器来修改我的自定义消息的响应以及模型状态错误。
我的模型看起来像
[Required(ErrorMessage = ErrorConstants.required)]
[StringLength(5, MinimumLength = 5, ErrorMessage = ErrorConstants.invalid)]
[RegularExpression("^[0-9]+$", ErrorMessage = ErrorConstants.incorrectInputFormat)]
public string ZipCode { get; set; }
我的控制器动作方法示例。请指导。
if (viewModel == null)
{
_dictionary = _apiResponseService.SetResponse("false", ErrorConstants.nullOrIncorrect);
return Ok(_dictionary);
}
if(!ModelState.IsValid)
{
return Ok(_apiResponseService.SetResponse("false", ErrorConstants.invalidJson, ModelState.ToDictionary(kvp => kvp.Key.Replace("viewModel.", ""),
kvp => kvp.Value.Errors.Select(error =>
{
if (error.Exception == null)
{
return error.ErrorMessage;
}
else
{
return string.Format(ErrorConstants.required, kvp.Key.Split('.').Last());
}
}).FirstOrDefault())));
}
我找到了解决方法。在控制器中,注释掉[ApiController]属性并完成工作。
新的[ApiController]
属性有一个功能
验证错误会自动触发HTTP 400响应。
模型状态很可能无效。这就是为什么它没有击中你的行动。
当
SuppressModelStateInvalidFilter
属性设置为true
时,将禁用默认行为。在services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
之后在Startup.ConfigureServices中添加以下代码:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressConsumesConstraintForFormFileParameters = true;
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true; //<-- THIS HERE
});
因此,不要完全删除[ApiController]
属性,保留它并禁用该默认行为,以便控制器可以保持它提供的任何优势,并且仍然可以检查操作中的模型状态。