2012-12-26 17 views
5

मैं वर्तमान में इस तरह के रूप एक ViewModel सेटअप:सत्यापित किया जा रहा नेस्टेड मॉडल

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 एक और मॉडल है कि कुछ इस तरह दिखता है: हमारे 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; } 
} 

अब, हम एक चेकबॉक्स हमारे DepositRequired करने के लिए बाध्य है बूलियन, और एक संपादक के लिए/बैंकइन्फो के लिए एक कस्टम टेम्पलेट। सबमिशन पर, हमें यह पता लगाने में परेशानी हो रही है कि बैंकइन्फो IF पर सत्यापन को अक्षम करने के लिए मॉडल की आवश्यकता नहीं है (उदाहरण के लिए, अगर हमें व्यूमोडेल पर संपत्ति की आवश्यकता नहीं है, तो यह अभी भी बैंकइन्फो पर वैल्यू ट्रिगर कर रहा है और इसलिए विफल रहा है किसी भी रूप में पोस्ट पर दुखी)। क्या ViewModel बांध पर w/नेस्टेड मॉडल सत्यापन को निपटने का कोई मानक तरीका है?

+0

एक नोट के रूप में, हम BankInfo के बंद हमारे कस्टम सत्यापनकर्ता चीर और ViewModel पर एक असज्जित संपत्ति के रूप में छोड़ भले ही, BankInfo सत्यापन अभी भी भले ही संपत्ति isn में किक ' फॉर्म जमा करने से बाध्य नहीं है। – antinescience

+0

बैंकइन्फो की सत्यापन में आने का कारण यह है कि डिफॉल्ट मॉडल बाइंडर पूरी तरह से बाध्यकारी और कंटेनर मॉडल को मान्य करने से पहले मॉडल के बच्चों को पूरी तरह से बांध देगा और मान्य करेगा। मुझे यकीन नहीं है कि कस्टम मॉडल बाइंडर बनाने के बाहर इस के लिए एक कामकाज है। – 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] के लिए +1 (http://fluentvalidation.codeplex.com/) - इसे एसओ पोस्ट पर अन्य कर्सर नज़रों के समूह से मिला और यह अब तक * कमाल * है। इस पर काम के लिए जेरेमी स्किनर के लिए बहुत धन्यवाद .. – antinescience

संबंधित मुद्दे