/ / Płynna weryfikacja za pomocą komunikatu dynamicznego - asp.net-mvc, asp.net-mvc-4, Fluentvalidation, Fluentvalidation-2.0

Płynna walidacja z dynamiczną wiadomością - asp.net-mvc, asp.net-mvc-4, fluentwalacja, fluentacja-2.0

Próbuję zbudować niestandardowe sprawdzanie poprawności z dynamicznym komunikatem w płynnej bibliotece sprawdzania poprawności.

Na przykład :

public class CreateProcessValidator : AbstractValidator<CreateProcessVM>
{
public CreateProcessValidator()
{
RuleFor(x => x.ProcessFile).Must((x,e) => IsProcessFileValid(x.ProcessFile))).WithMessage("Parse failed with error : {0}");
}

public bool IsProcessFileValid(HttpPostedFileBase file)
{
var errorMessage = "..."  // pass result to validaton message ?
// logic
return false;
}
}

Czy istnieje jakieś obejście, w jaki sposób przekazać wynik sprawdzania poprawności?

Dzięki

Odpowiedzi:

14 dla odpowiedzi № 1

Próbowałeś czegoś takiego?

public class IsProcessFileValid : PropertyValidator
{
public IsProcessFileValid(): base("{ValidationMessage}") {}

protected override IsValid(PropertyValidatorContext context)
{
if (!IsProcessFileValid1(context))
context.MessageFormatter.AppendArgument("ValidationMessage",
"Custom validation message #1");

if (!IsProcessFileValid2(context))
context.MessageFormatter.AppendArgument("ValidationMessage",
"Custom validation message #2");

// ...etc

return true;
}

private bool IsProcessFileValid1(PropertyValidatorContext context)
{
// logic
return false;
}

private bool IsProcessFileValid2(PropertyValidatorContext context)
{
// logic
return false;
}

// ...etc
}

Z metodą rozszerzenia:

public static class IsProcessFileValidExtensions
{
public static IRuleBuilderOptions<T, object> MustBeValidProcessFile<T>
(this IRuleBuilder<T, object> ruleBuilder)
{
return ruleBuilder.SetValidator(new IsProcessFileValid());
}

}

... a następnie użyj go bez niestandardowego WithMessage:

public CreateProcessValidator()
{
RuleFor(x => x.ProcessFile).MustBeValidProcessFile();
}

Tworząc niestandardowy PropertyValidator, możesz obudować domyślny komunikat sprawdzania poprawności w tej klasie i ustawić go jako dynamiczny. Nie wolno ci jednak korzystać z .WithMessage rozszerzenie podczas deklarowania RuleFor, ponieważ zastąpiłoby to domyślny komunikat sprawdzania poprawności, który został dostosowany bezpośrednio w PropertyValidator.


1 dla odpowiedzi nr 2

Nie ma na to sposobu. Chciałbym podzielić złożoną metodę sprawdzania poprawności, którą aktualnie masz, na mniejsze metody (IsProcessFileValid1, IsProcessFileValid2, IsProcessFileValid3, ...), abyś miał bardziej precyzyjną kontrolę nad komunikatem o błędzie. Również każda metoda będzie odpowiedzialna za walidację tylko raz, aby zwiększyć ich przydatność do ponownego użycia (jedna odpowiedzialność):

RuleFor(x => x.ProcessFile)
.Must(IsProcessFileValid1)
.WithMessage("Message 1")
.Must(IsProcessFileValid2)
.WithMessage("Message 2")
.Must(IsProcessFileValid3)
.WithMessage("Message 3");

Zauważ też, jak uprościłem lambda, ponieważ metoda może być bezpośrednio przekazana Must jako argument.