【问题标题】:Using FluentValidation's WithMessage method with parameters with a WarningMessage使用带有警告消息的参数的 FluentValidation 的 WithMessage 方法
【发布时间】:2016-08-18 18:28:24
【问题描述】:

总的来说,我是 FluentValidation 的新手。我正在编写一个验证器,但我似乎无法弄清楚如何使用 WarningMessage 而不是 ErrorMessage 来执行 .WithMessage 并使用参数。

我可以这样做:

RuleFor(x => x.Endorsement)
            .Must((coverage, endorsement) => HaveCoveragePerAcreOverMinimum(_coverage, coverage))
            .When(x => (!HaveSpecialRequest(_coverage) && !HavePermissionsToOverrideLimits()))
            .WithMessage("Some error message {0}", x => x.MyError);

但这会将其设置为错误消息,我需要一个警告消息。我试过了,但没有骰子:

RuleFor(x => x.Endorsement)
            .Must((coverage, endorsement) => HaveCoveragePerAcreOverMinimum(_coverage, coverage))
            .When(x => (!HaveSpecialRequest(_coverage) && !HavePermissionsToOverrideLimits()))
            .WithMessage(new WarningMessage("Some warning message {0}", x => x.MyError));

【问题讨论】:

    标签: fluentvalidation


    【解决方案1】:

    在 FluentValidation(或 Mvc 的 ModelState)中没有直接实现警告消息。

    在 FluentValidation 中,您有一个 WithState() 可用于此目的的扩展方法。

    首先,你可以创建一个枚举

    public enum ValidationErrorLevel
        {
            Error,
            Warning
        }
    

    然后,您可以在静态类中编写一些扩展方法来使用警告和错误。

    一个在你的验证器类中使用

    public static IRuleBuilderOptions<T, TProperty> AsWarning<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule)
    {
       return rule.WithState<T, TProperty>(x => ValidationErrorLevel.Warning);
    }
    

    你可以这样使用它

    RuleFor(x => x.Endorsement)
                .Must((coverage, endorsement) => HaveCoveragePerAcreOverMinimum(_coverage, coverage))
                .When(x => (!HaveSpecialRequest(_coverage) && !HavePermissionsToOverrideLimits()))
                .WithMessage("Some error message {0}", x => x.MyError)
                .AsWarning();
    

    很少有其他方法可用于管理您的验证结果

    public static IList<ValidationFailure> GetWarnings(this ValidationResult result)
    {
       return result.Errors.Where(m => m.CustomState != null && Convert.ToInt32(m.CustomState) == (int)ValidationErrorLevel.Warning).ToList();
    }
    
    public static IList<ValidationFailure> GetErrors(this ValidationResult result)
    {
       return result.Errors.Except(result.GetWarnings()).ToList();
    }
    

    那么,你应该使用

    validator.Validate(<someclass>)
    

    而不是

    validator.ValidateAndThrow(<someclass>)
    
    
    
    
    var results = validator.Validate(<someclass>);
    

    然后您可以将错误放入 ModelState 中,例如

    foreach (var error in result.GetErrors()) {
       ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
    }
    

    并为警告做一些其他事情,例如将其放入 TempData

     TempData["warnings"] = new List<string>();
     ((List<string>)TempData[WarningMessageKey]).AddRange(result.GetWarnings().Select(warning => warning.ErrorMessage));
    

    然后您可以像显示任何其他 TempData 一样显示它们。

    【讨论】:

      【解决方案2】:

      验证(通常)将错误附加到 ModelState - 它本身就是一个对象,因此如果您在 if(ModelState.IsValid) 行上放置一个断点,您可以查看 ModelState 的其他属性。

      有错误(和错误消息)的东西要么存在,要么不存在。如果没有问题,则没有错误消息,如果有问题,则会添加错误消息。

      如果我是你,如果模型状态在你的控制器中无效,我会使用

      收到所有错误消息
      var allErrors = ModelState.Values.SelectMany(v => v.Errors);
      

      然后遍历每一个并决定你想用它做什么。

      我希望这能回答或至少有所帮助,因为我不完全确定您在问/试图达到什么目的。

      【讨论】:

        猜你喜欢
        • 2012-12-19
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多