我一般都是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));
答案 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一样显示它们。