使用带有WarningMessage参数的FluentValidation&WithMessage方法

时间:2016-08-18 18:28:24

标签: fluentvalidation

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

我可以这样做:

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

但是它将它设置为ErrorMessage并且我需要一条警告消息。我尝试了这个,但没有骰子:

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));

2 个答案:

答案 0 :(得分:0)

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

有错误(和错误消息)的东西是否存在。如果没有问题,则没有错误消息,如果出现问题,将添加错误消息。

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

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

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

我希望这个答案或者至少有帮助,因为我不完全确定你要求/想要达到的目的。

答案 1 :(得分:0)

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

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

首先,您可以创建枚举

public enum ValidationErrorLevel
    {
        Error,
        Warning
    }

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

在Validator类中使用

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一样显示它们。