2012-04-17 13 views
13

मैं एक MVC3 दृश्य मॉडल के रूप में परिभाषित किया है:फ़्लुएंट सत्यापन का उपयोग करके सूची में प्रत्येक स्ट्रिंग के विरुद्ध आप कैसे मान्य करते हैं?

public class AccountsValidator : AbstractValidator<AccountViewModel> 
{ 
    public AccountsValidator() 
    { 
     RuleFor(x => x.Accounts).SetCollectionValidator(new AccountValidator()); //This won't work 
    } 
} 

और खाता सत्यापन संभवतः परिभाषित किया जाएगा:

[Validator(typeof(AccountsValidator))] 
public class AccountViewModel 
{ 
    public List<string> Accounts { get; set; } 
} 

सत्यापन की सहायता से के रूप में FluentValidation (v3.3.1.0) का उपयोग कर परिभाषित

public class AccountValidator : AbstractValidator<string> { 
    public OrderValidator() { 
     RuleFor(x => x).NotNull(); 
     //any other validation here 
    } 
} 

मैं सूची में प्रत्येक खाते को documentation में वर्णित अनुसार वैल्यूएटेड होना चाहता हूं। हालांकि, SetCollectionValidator पर कॉल काम नहीं करता है क्योंकि List<string> का उपयोग करते समय यह कोई विकल्प नहीं है, हालांकि विकल्प वहां होगा यदि इसे List<Account> के रूप में परिभाषित किया गया था। क्या मैं कुछ भूल रहा हूँ? मैं List<Account> का उपयोग करने के लिए अपना मॉडल बदल सकता हूं और फिर खाता वर्ग परिभाषित कर सकता हूं लेकिन मैं वास्तव में सत्यापन के अनुरूप अपना मॉडल बदलना नहीं चाहता हूं।

@model MvcApplication9.Models.AccountViewModel 

@using (Html.BeginForm()) 
{ 
    @*The first account number is a required field.*@ 
    <li>Account number* @Html.EditorFor(m => m.Accounts[0].Account) @Html.ValidationMessageFor(m => m.Accounts[0].Account)</li> 

    for (int i = 1; i < Model.Accounts.Count; i++) 
    { 
     <li>Account number @Html.EditorFor(m => m.Accounts[i].Account) @Html.ValidationMessageFor(m => m.Accounts[i].Account)</li> 
    } 

    <input type="submit" value="Add more..." name="add"/> 
    <input type="submit" value="Continue" name="next"/> 
} 

उत्तर

17

निम्नलिखित काम करना चाहिए:

public class AccountsValidator : AbstractValidator<AccountViewModel> 
{ 
    public AccountsValidator() 
    { 
     RuleFor(x => x.Accounts).SetCollectionValidator(
      new AccountValidator("Accounts") 
     ); 
    } 
} 

public class AccountValidator : AbstractValidator<string> 
{ 
    public AccountValidator(string collectionName) 
    { 
     RuleFor(x => x) 
      .NotEmpty() 
      .OverridePropertyName(collectionName); 
    } 
} 
+1

धन्यवाद, SetCollectionValidator ने काम किया था। मुझे पूरा यकीन नहीं है कि यह कथन पहले क्यों उपलब्ध नहीं था! हालांकि, यह अभी भी काफी सही काम नहीं कर रहा है। सत्यापन का उपयोग किया जा रहा है लेकिन किसी भी त्रुटि को अब "राज्य [0]।" की कुंजी "के साथ मॉडल स्थिति में लिखा गया है। मैं प्रत्येक खाता संख्या को प्रदर्शित करने के लिए सत्यापन में ValidationMessageFor (m => m.Accounts [i]) का उपयोग करता हूं इसलिए मॉडलस्टेट में "खाता [0]" की कुंजी होनी चाहिए। मैंने रिक्त नाम का उपयोग करके ओवरराइडप्रॉपर्टीनाम (संग्रहनाम) को बदलने और पूरी तरह से इस कथन को हटाने का प्रयास किया है लेकिन अभी भी इसे काम नहीं कर सकता है। – Dangerous

+0

मैं इसे @ एचटीएमएल। वैलिडेशन मैसेज ("अकाउंट्स [i] .ccounts" का उपयोग करके काम कर सकता हूं) लेकिन फिर यह एक काम की तरह लगता है? मैं इस पर आपके विचारों की सराहना करता हूं? एक बार फिर धन्यवाद। – Dangerous

+1

मैंने स्ट्रिंग के बजाय खाता मॉडल का उपयोग करने का निर्णय लिया है। इसलिए, त्रुटियों को अब सही तरीके से रिपोर्ट किया गया है। उपर्युक्त संग्रह नाम इसलिए पैरामीटर के रूप में आवश्यक नहीं है। – Dangerous

1

मान्यता कक्षाएं:

using FluentValidation; 
using System.Collections.Generic; 

namespace Test.Validator 
{ 

    public class EmailCollection 
    { 
     public IEnumerable<string> email { get; set; } 

    } 

    public class EmailValidator: AbstractValidator<string> 
    { 
     public EmailValidator() 
     { 
      RuleFor(x => x).Length(0, 5); 
     } 

    } 

    public class EmailListValidator: AbstractValidator<EmailCollection> 
    { 
     public EmailListValidator() 
     { 
      RuleFor(x => x.email).SetCollectionValidator(new EmailValidator()); 
     } 

    } 



} 

नोट:

संदर्भ के लिए, इस दृश्य है कि मैं का उपयोग कर रहा है मैं fluentvalidation के नवीनतम एमवीसी 5 (Nuget) संस्करण का इस्तेमाल किया।

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

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