如何截获FluentValidation错误响应,以便将其格式化为我的标准

时间:2018-07-12 22:39:38

标签: c# asp.net-core asp.net-core-2.0 fluentvalidation modelstate

我正在使用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错误响应以匹配项目错误消息标准?

0 个答案:

没有答案