/ / Plynulá validácia s dynamickou správou - asp.net-mvc, asp.net-mvc-4, fluentvalidácia, fluentvalidácia-2,0

Plynulá validácia s dynamickou správou - asp.net-mvc, asp.net-mvc-4, fluentvalidation, fluentvalidation-2.0

Pokúšam sa vytvoriť vlastnú validáciu s dynamickou správou v plynulej validačnej knižnici.

Napríklad :

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;
}
}

Existuje riešenie, ako odovzdať výsledok validácie?

Vďaka

odpovede:

14 pre odpoveď č. 1

Skúsili ste niečo takéto?

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
}

S metódou rozšírenia:

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

}

... a potom ho používať bez zvyku WithMessage:

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

Vytvorením vlastného PropertyValidator, môžete zapuzdriť predvolenú overovaciu správu v rámci tejto triedy a urobiť ju dynamickou. Avšak nesmiete používať .WithMessage rozšírenie pri deklarovaní RuleFor, pretože by to prepísalo predvolenú overovaciu správu, ktorú ste upravili priamo vo vnútri PropertyValidator.


1 pre odpoveď č. 2

Nie je možné to urobiť. Rozdelil by som komplexnú metódu validácie, ktorú momentálne máte, na menšie metódy (IsProcessFileValid1, IsProcessFileValid2, IsProcessFileValid3, ...), aby ste nad chybovou správou mohli mať jemnejšiu kontrolu. Každá metóda bude tiež zodpovedná za validáciu iba vtedy, ak sa bude týkať ich opätovného použitia (jedna zodpovednosť):

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

Všimnite si tiež, ako som zjednodušil lambdu, pretože metódu bolo možné priamo odovzdať Must ako argument.