2016-08-18 2 views
0

Я новичок в FluentValidation в целом. Я пишу валидатор, и я не могу понять, как сделать .WithMessage с WarningMessage вместо ErrorMessage и использовать параметры.Использование метода WithMessage FluentValidation с параметрами с предупреждениемMessage

Я могу это сделать:

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

Validation (в целом) Прикрепляет ошибки к ModelState - что само по себе является объектом, так что если вы поставите точку останова на линии, если (ModelState.IsValid) вы можете посмотреть при других свойствах ModelState.

Вещь с ошибками (и сообщения об ошибках), они либо есть, либо нет. Если нет проблемы, сообщение об ошибке не появляется, и если есть ошибка, сообщение об ошибке будет добавлено.

Если бы я тебя, если модель государства не является действительным в контроллере я хотел бы получить все сообщения об ошибках с помощью

var allErrors = ModelState.Values.SelectMany(v => v.Errors); 

, а затем перебрать каждого из них и решить, что вы хотите с ним делать.

Я надеюсь, что это ответит или, по крайней мере, поможет, поскольку я не совсем уверен, что вы просите/пытаетесь добраться.

0

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

Смежные вопросы