В 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.