2012-12-26 103 views
5

我现在有一个视图模型设置为这样:验证嵌套模型

public class OurViewModel 
    { 
     public OurViewModel() { } 

     [Required] 
     public int LeadID { get; set; } 
     [Required] 
     public int Rate { get; set; } 
     [Required] 
     public bool DepositRequired { get; set; } 
     [RequiredIfOtherPropertyIsTrue("DepositRequired")] 
     public BankInfo { get; set; } 
    } 

......在这种情况下,“RequiredIfOtherPropertyIsTrue”是,确实差不多就是它说一个验证:检查是否另一个属性是真(在这种情况下,我们的布尔指示是否需要押金),和BankInfo是另一种模式,看起来是这样的:现在

public class BankInfo 
{ 
    public enum AccountTypeEnum 
    { 
     CHECKING, 
     SAVINGS 
    } 

    public BankAccountInfo() { } 

    [DisplayName("Account Number")] 
    [Required(ErrorMessage = "You must provide a valid bank account number")] 
    public String AccountNumber { get; set; } 

    [DisplayName("Bank Routing Number")] 
    [Required(ErrorMessage = "You must provide a valid routing number")] 
    [StringLength(9, MinimumLength = 9, ErrorMessage = "Your bank routing number must be exactly 9 digits")] 
    public String ABANumber { get; set; } 

    [DisplayName("Bank Account Type")] 
    [Required] 
    public AccountTypeEnum AccountType { get; set; } 

    [DisplayName("Name on Bank Account")] 
    [Required(ErrorMessage = "You must provide the name on your bank account")] 
    public String AccountName { get; set; } 
} 

,在我们的视图模型,我们必将对我国DepositRequired复选框布尔型和一个EditorForW/BankInfo的自定义模板。提交后,我们无法弄清楚如何禁用模型所要求的BankInfo验证(例如,即使我们不需要ViewModel上的属性,它仍然在BankInfo上触发val并因此失败悲惨地在任何形式的职位上)。有没有任何标准的方式来处理ViewModel绑定w/nested模型验证?

+0

作为一个说明,即使我们撕裂我们的自定义验证过BankInfo,并把它作为视图模型未修饰的属性,则BankInfo验证仍然踢,即使房地产ISN”不受表格提交的约束。 – antinescience

+0

BankInfo验证启动的原因是默认模型联编程序在完成绑定并验证容器模型本身之前会完全绑定和验证模型的子项。在制作自定义模型绑定器之外,我不确定是否有解决方法。 – rossisdead

回答

5

不幸的是,内置的验证,你必须使用

ModelState.Remove("BankInfo"); 

有条件地忽略对象的任何验证失败。

如果使用FluentValidation是一个选项,你可以做这样的事情在你的OurViewModelValidator:

RuleFor(ourViewModel=> ourViewModel.BankInfo).SetValidator(new BankInfoValidator()).When(ourViewModel=> ourViewModel.DepositRequired); 

,然后让该对象的BankInfoValidator处理验证。

喜欢的东西:

public class BankInfoValidator : AbstractValidator<BankInfo> 
{ 
    public BankAccountInfoValidator() 
    { 
     RuleFor(bank => bank.AccountName).NotEmpty().WithMessage("You must provide a name for your bank account."); 
     RuleFor(bank => bank.AccountNumber).NotEmpty().WithMessage("You must provide an account number for your bank information."); 
     RuleFor(bank => bank.AccountType).NotEmpty().WithMessage("You must select what kind of bank account you're entering information for (checking, savings)."); 
     RuleFor(bank => bank.ABANumber).NotEmpty().WithMessage("You must provide a routing number for your bank information."); 
     RuleFor(bank => bank.ABANumber).Must(BeOnlyDigits).WithMessage("Your routing number can only contain numeric characters, 0-9."); 
     RuleFor(bank => bank.AccountNumber).Must(BeOnlyDigits).WithMessage("Your account number can only contain numeric characters, 0-9."); 
    } 

    private bool BeOnlyDigits(string digitString) 
    { 
     int result; 
     return int.TryParse(digitString, out result); 
    } 
+0

+1 [FluentValidation](http://fluentvalidation.codeplex.com/) - 在SO帖子中发现了一堆粗略的目光,它的*真棒*迄今为止。非常感谢杰里米斯金纳对它的工作.. – antinescience