2012-12-26 34 views
5

Şu anda gibi bir ViewModel kurulum var:doğrulanıyor İçiçe Modelleri

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

... bu durumda, "RequiredIfOtherPropertyIsTrue" hemen hemen, dediğini yapar bir doğrulayıcı: Başka özelliği ise denetler gerçek (bu durumda, bizim boolean depozito talep edilmektedir olmadığını gösteren) ve BankInfo şuna benzer başka modelidir: bizim ViewModel,

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

Şimdi, bizim DepositRequired bağlı bir onay kutusu boolean ve bir EditorFor w/BankInfo için özel bir şablon. Sunumun ardından, BankInfo IF numaralı telefon hattında doğrulamayı devre dışı bırakmanın, model tarafından gerekmediğini bulmakta sorun yaşıyoruz (örn., ViewModel'de özellik gerektirmese bile, yine de BankInfo'da val'i tetikliyor ve bu nedenle başarısız oluyor. sefil herhangi bir formda). ViewModel bağlamada iç içe model doğrulama işleminin standart bir yolu var mı? doğrulama yerleşik

+0

, BankInfo doğrulama hala 'bile mülkiyet ISN'nin yer tekmeler Form gönderimine bağlı olmak. – antinescience

+0

BankInfo'nun onaylama tekerinin nedeni, varsayılan model bağlayıcının, kapsayıcı modelin bağlayıcısını ve geçerliliğini tamamlamadan önce, modelin çocuklarını tamamıyla doğrulayacağı ve doğrulayacağıdır. Bunun dışında özel bir model ciltleme yapmak için bir geçici çözüm olduğundan emin değilim. [FluentValidation] için – rossisdead

cevap

5

yazık ki, sen

ModelState.Remove("BankInfo"); 

şartlı o nesne üzerinde herhangi bir doğrulama hatalarını görmezden kullanmak gerekir.

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

ve daha sonra bu nesnenin BankInfoValidator kolu doğrulama bakalım: FluentValidation kullanarak bir seçenek ise

, kendi OurViewModelValidator böyle bir şey yapabilirsiniz.

şey gibi: Biz BankInfo kapalı bizim özel doğrulayıcı rip ve ViewModel üzerinde undecorated özelliği olarak bırakın bile not olarak

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 (http://fluentvalidation.codeplex.com/) - SO gönderilerindeki bir dizi övgüsel bakıştan bulundu ve şu ana kadar * harika *. Jeremy Skinner'ın çalışmaları için çok teşekkürler. – antinescience