2011-11-10 6 views
5

मुझे किसी अन्य तर्क को करने के लिए पृष्ठ के प्रत्येक लोड/पोस्टबैक पर पेज.इस्वालिड का मूल्य जांचना होगा।यह जांचना कि कोई पृष्ठ IsValid है, जब CausesValidation गलत है

हालांकि, अगर पृष्ठ को वैध नहीं कहा जा सकता है, तो वैध नहीं है।

पेज। वैलिडेट() को कॉल नहीं किया जाएगा यदि वापस पोस्ट किया गया नियंत्रण कारणों को गलत पर सेट किया गया था।

यदि मैं पेज। वैलिडेट() स्वयं को कॉल करता हूं, तो यह पृष्ठ पर सभी मान्यताओं को प्रदर्शित करने का कारण बनता है।

वर्तमान में इस समस्या के दो समाधान हैं।

पहली विधि, मैं IsValid के आस-पास पकड़ने का प्रयास करता हूं। मैं अपवाद पकड़ता हूं जो सत्यापन तब नहीं हुआ है जब सत्यापन नहीं हुआ है। मैं फिर पेज को कॉल करता हूं। वैलिडेट, IsValid के मान की जांच करें, फिर सभी मान्यताओं के माध्यम से उन सभी को चिह्नित करने के लिए लूप करें ताकि वे पृष्ठ पर दिखाई न दें।

bool isValid = false; 

try 
{ 
    isValid = this.IsValid; 
} 
catch (System.Web.HttpException exception) 
{ 
    if(exception.Message == "Page.IsValid cannot be called before validation has taken place. It should be queried in the event handler for a control that has CausesValidation=True and initiated the postback, or after a call to Page.Validate.") 
    { 
     //Validation has NOT occurred so run it here, store the result, then set all the validators to valid. 
     this.Validate(); 
     isValid = this.IsValid; 

     foreach (IValidator validator in this.Validators) 
     { 
      validator.IsValid = true; 
     } 
    } 
} 

दूसरी विधि, अंतर्निहित पृष्ठ से फ़ील्ड _ को सत्यापित करने के लिए प्रतिबिंब का उपयोग करना है। फिर मैं सत्यापन को कॉल करने में पहली विधि के समान करता हूं यदि पृष्ठ को सत्यापित नहीं किया गया है और फिर बाद में सभी मान्यताओं को रीसेट कर रहा है।

bool isValidated = (bool)typeof(Page).GetField("_validated", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(this); 

bool isValid = false; 

if (isValidated) 
{ 
    isValid = this.IsValid; 
} 
else 
{ 
    this.Validate(); 
    isValid = this.IsValid; 

    foreach (IValidator validator in this.Validators) 
    { 
     validator.IsValid = true; 
    } 
} 

के रूप में मैं अपवाद द्वारा कोडिंग पसंद नहीं है और मैं प्रतिबिंब का उपयोग कर सत्यापित होटल में प्राप्त करने के लिए पसंद नहीं है के रूप में वहाँ किसी कारण रहा होगा उस में निजी रखा गया था मैं इस समाधान के या तो पसंद नहीं है प्रथम स्थान।

क्या किसी और के पास कोई बेहतर समाधान या कोई विचार है?

+0

पर

Page.Validate("ValidationGroupName") 

देखो यह कुछ आप सर्वर साइड क्या करना है कि है? क्लाइंट-साइड सत्यापन ऑनलोड करने के लिए आसान हो सकता है। –

+0

@JamesJohnson कोड जो मुझे वैध/अमान्य पर चलाना है सर्वर सर्वर को चलाने के लिए है, हां। यद्यपि यह क्लाइंट पक्ष भी हो सकता है, लेकिन मुझे नहीं लगता कि इससे कैसे मदद मिलेगी, क्योंकि मुझे अभी भी जांचना होगा कि पृष्ठ वैधता फायरिंग/दिखाए बिना वैध है या नहीं। –

+0

एक विशिष्ट प्रमाणीकरण समूह का उपयोग करने के बारे में क्या, और पृष्ठ का उपयोग करें। वैध (स्ट्रिंग) अधिभार? – sisve

उत्तर

9

मेरा सुझाव है कि आप बस अपने सत्यापनकर्ताओं को EnableClientScript विकल्प के साथ गलत पर सेट करें।

इस तरह, आप अपने कोड में

if (this.Page.IsValid) 

कॉल करने के लिए सक्षम हो जाएगा।

आप एक विशिष्ट मान्यता समूह मान्य करने के लिए चाहते हैं, तो सिर्फ सर्वर साइड में इस लाइन का उपयोग करें: इन examples of group validation

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