2010-12-20 12 views
6

मेरे पास एक एएसपी.नेट एमवीसी 2 प्रोजेक्ट है जिसमें मैंने वेब पेज फॉर्म से डेटा प्राप्त करने के लिए डेटा ट्रांसफर ऑब्जेक्ट बनाया है। इस फॉर्म में चेकबॉक्स के दो समूह हैं। मैं यह सुनिश्चित करने के लिए ऑब्जेक्ट को सत्यापित करना चाहता हूं कि प्रत्येक समूह में कम से कम एक चेकबॉक्स चेक किया गया हो।एक एएसपी.नेट एमवीसी सत्यापनकर्ता यह सुनिश्चित करने के लिए कि कम से कम एक चेकबॉक्स चेक किया गया है

मैं सर्वर की ओर से सत्यापन कर रहा हूं ताकि उपयोगकर्ता किसी भी क्लाइंट-साइड सत्यापन के आसपास हैक करने में सक्षम न हो। (मैं बाद में jQuery के साथ क्लाइंट-साइड सत्यापन जोड़ूंगा; यह आसान है।)

मेरी समझ यह है कि मुझे अपने डेटा ट्रांसफर ऑब्जेक्ट क्लास के लिए अपना कस्टम वैलिडेशन एट्रिब्यूट बनाना है, लेकिन मुझे समझ में नहीं आता कि कैसे बनाना और उपयोग करना है एक यह सुनिश्चित करने के लिए कि उनमें से कम से कम एक सत्य है, चेकबॉक्स गुणों की मनमानी सूची स्वीकार कर सकता है।

[AtLeastOneCheckbox("set1check1", "set1check2", "set1check3", 
    ErrorMessage = "You must check at least one checkbox in set 1.")] 
[AtLeastOneCheckbox("set2check1", "set2check2", "set2check3", "set2check4", "set2check5", 
    ErrorMessage = "You must check at least one checkbox in set 2.")] 
public class MyFormDTO 
{ 
    ... 
} 

क्या AtLeastOneCheckboxAttribute के कार्यान्वयन दिखाई देगा: मैं मैं इस तरह विशेषताओं फोन करना होगा अनुमान लगा रहा हूँ?

या वहां एक अलग तरह से है कि मैं सत्यापन के इस प्रकार करना चाहिए है?

+0

इसके अलावा, मैं सोच रहा हूँ क्यों माइक्रोसॉफ्ट MVC सब कुछ के लिए यह 'विशेषता' सत्यापन प्रणाली में मुझे धक्का है। यदि मैं RequiredAttribute और StringLengthAttribute और अन्य सत्यापन विशेषताओं द्वारा किए गए चेक का उपयोग करता हूं, तो मैं प्रत्येक प्रॉपर्टी पर रखता हूं, और फिर मैं अपनी ऑब्जेक्ट में एक IsValid() विधि भी जोड़ता हूं जो इस ऑब्जेक्ट पर गुणों पर अन्य जांच करता है कि यह मान्य है या नहीं, क्या मॉडलस्टेट मेरे IsValid() विधि के परिणाम को प्रतिबिंबित करने का कोई तरीका है? –

उत्तर

4

अगर आपके पास कई चेकबॉक्स समूह नहीं हैं, तो आप सिर्फ विशेषता कई बार deine की जरूरत है।

[AttributeUsage(AttributeTargets.Class)] 
public class AtLeastOneCheckboxAttribute : ValidationAttribute 
{ 
    private string[] _checkboxNames; 

    public AtLeastOneCheckboxAttribute(params string[] checkboxNames) 
    { 
     _checkboxNames = checkboxNames; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var propertyInfos = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) 
      .Where(x=>_checkboxNames.Contains(x.Name)); 

     var values = propertyInfos.Select(x => x.GetGetMethod().Invoke(value, null)); 
     if (values.Any(x => Convert.ToBoolean(x))) 
      return ValidationResult.Success; 
     else 
     { 
      ErrorMessage = "At least one checkbox must be selected"; 
      return new ValidationResult(ErrorMessage); 
     } 
    } 
} 

अद्यतन

तुम बाहर पाया है के रूप में, वर्ग-स्तरीय मान्यता कहा जाता है के बाद ही सभी गुण गुजरती हैं। त्रुटि प्राप्त करने के लिए, केवल खाली स्ट्रिंग का उपयोग कुंजी के रूप में करें।

+0

मैंने आपके कोड का उपयोग करने की कोशिश की, लेकिन ऐसा प्रतीत नहीं होता है। मैं अपने वस्तु पर AtLeastOneCheckboxAttribute सेट कर रहा हूं और फिर नियंत्रक में ModelState जाँच, लेकिन इस विशेषता के विधि अगर है() कभी नहीं कहा जाता है, किया जा रहा है, भले ही मेरी RequiredAttributes और StringLengthAttributes ठीक से त्रुटि संदेश पैदा कर रहे हैं। इसके अलावा - मैं इसे अपने दृश्य में सत्यापन संदेश कैसे प्राप्त करूं? <% = Html.ValidationMessageFor (मॉडल => Model.Set1check1)%>, या ऐसा कुछ? –

+0

मेरे प्रश्न के पहले भाग के लिए एक समाधान मिला - स्पष्ट रूप से कक्षा-स्तर विशेषताओं को तब तक नहीं बुलाया जाता है जब तक कि सभी संपत्ति-स्तरीय गुण पास न हों। में इसके साथ जी सकता हूँ। लेकिन मैं अभी भी इस विशेषता के त्रुटि संदेश को देखने में कैसे काम करने की कोशिश कर रहा हूं ... –

+0

कृपया मेरा अपडेट देखें। – Aliostad

0

आपका डीटीओ, जो मैं अपने ViewModel अनुमान लगा रहा हूँ IDataErrorInfo ihert कर सकते हैं। तो फिर तुम इस तरह अपने सत्यापन कर सकते हैं (ध्यान दें मैं इस संकलन नहीं था)

//I'm guessing you have a list of checkboxes 
IEnumerable<bool> checkBoxes1; 
IEnumerable<bool> checkBoxes2; 

public class MyFormDTO : IDataErrorInfo 
{ 
    public string this[string prop] 
    { 
     get 
     { 
      if(prop == "checkBoxes1") 
      { 
       if(checkBoxes1.Any(x => x == true)) 
       { 
        return "Error: You need to select atleast one checkbox from set1"; 
       } 
      } 
      else if(prop == "checkBoxes2") 
      { 
       if(checkBoxes2.Any(x => x == true)) 
       { 
        return "Error: You need to select atleast one checkbox from set2"; 
       } 
      } 
      return null; 
     } 
    } 
    public string Error { get { return null; } } 
} 
संबंधित मुद्दे