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 № 1Pró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.