2

我想在流利的验证库中建立动态消息的自定义验证。流利的验证与动态消息

例如:

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

是这里的任何解决办法如何通过验证结果呢?

感谢

回答

1

有没有办法做到这一点。我会将您当前使用的复杂验证方法拆分为更小的方法(IsProcessFileValid1,IsProcessFileValid2,IsProcessFileValid3,...),以便您可以对错误消息进行更细致的控制。同样,每个方法将负责验证只有一次的关注使他们更可重复使用的(单一职责):

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

还要注意我是如何简化了拉姆达的方法可以直接传递给Must作为参数。

+0

是,分割方法是最初的想法,但由于小法之一,我试图验证XML文件对XSD这个心不是解决我的问题,需要通过导致用户... – Mennion 2013-04-09 13:50:27

13

你有没有试过类似的东西?

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 
} 

随着扩展方法:

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

} 

...然后使用它,而自定义WithMessage

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

通过创建一个自定义PropertyValidator,你可以封装默认的验证消息在这个班级内,并使之充满活力。但是,在声明RuleFor时,不得使用.WithMessage扩展名,因为它会覆盖在PropertyValidator内直接定制的默认验证消息。

+0

感谢您的回答,我是有点忙现在,但下周我会尝试。 – Mennion 2013-04-10 12:47:02

+0

你有机会尝试这个吗?我有一种感觉,它会起作用。 – danludwig 2013-04-23 20:54:20

+0

谢谢 - 正是我需要的。对我来说验证一个ZipFile类型的HttpPostedFileBase(DotNetZip) – 2014-11-28 11:24:53