我正在使用ASP.NET Core 2.1 API,该API当前具有一个全局ValidateModelAttribute过滤器,该过滤器可拦截OnActionExecuting方法中的context.ModelState,以便它可以格式化任何模型状态错误,以匹配错误消息的项目设计标准。
这很好。但是,我决定将FluentValidation添加到项目中,即使它也可以正常工作,它也返回模型状态响应,而无需在ValidateModelAttribute过滤器类中单击OnActionExecuting方法。
这是Startup-> AddMvc的ConfigureServices方法中的代码
services.AddMvc(config =>
{
config.Filters.Add(typeof(ValidateModelAttribute));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<ServiceTypeCodeValidator>())
.AddJsonOptions(opt =>
{
opt.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
这里是ValidateModelAttribute类本身,仅供参考;
public class ValidateModelAttribute : ActionFilterAttribute
{
/// <summary>
/// Validates model state upon action execution
/// </summary>
/// <param name="context">ActionExecutingContext object</param>
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.ModelState.IsValid) return;
var errorList = context.ModelState.Where(ms => ms.Value.Errors.Any()).ToDictionary(
kvp => kvp.Key,
kvp => kvp.Value.Errors.Select(e => string.IsNullOrEmpty(e.ErrorMessage) ? e.Exception.Message : e.ErrorMessage).ToArray()
);
var validationErrors = new ValidationErrors();
foreach (var item in errorList)
{
foreach (var message in item.Value)
{
if (validationErrors.Errors.ContainsKey(item.Key))
{
validationErrors.Errors[item.Key].Add(message);
}
else
{
validationErrors.Errors.Add(item.Key, new List<string>() { message });
}
}
}
var globalError = new GlobalError { Errors = errorList };
context.Result = new BadRequestObjectResult(globalError);
}
}
我假定由于这是asp.net管道,并且AddFluentValidation在config.filters.Add行之后,所以这就是为什么我无法通过ValidateModelAttribute过滤器覆盖FluentValidation的错误消息。
所以我的问题是,FluentValidation是否提供我可以重写的任何挂钩,以格式化modelstate错误响应以匹配项目错误消息标准?