2010-08-01 5 views
9

मैं एएसपीनेट सत्यापनकर्ताओं को विस्तारित करना चाहता हूं जैसे कि मैं एक वैधकर्ता को दूसरे पर निर्भर कर सकता हूं। मेरी स्थिति यह है कि हमें किसी टेक्स्टबॉक्स में दिनांक सत्यापित करना होगा। आम तौर पर मैं केवल एक आवश्यक फ़ील्ड वैलिडेटेटर (दिनांक प्रदान करने के लिए सुनिश्चित करने के लिए) का उपयोग करता हूं, तुलना वैलिडेटर (यह सुनिश्चित करने के लिए कि तिथि एक तिथि है) और आखिर में एक रेंज वैलिडेटेटर (यह सुनिश्चित करने के लिए कि तिथि आवश्यक सीमा के भीतर है)।विस्तारित एएसपी.NET मान्यकर्ता

इस समस्या में यह है कि वैधकर्ता एक दूसरे पर निर्भर नहीं हैं, जिसके परिणामस्वरूप उपयोगकर्ता प्रत्येक सत्यापनकर्ता के लिए एक बार में सभी तीन संदेशों को देखेगा, वास्तव में जब हम उन्हें देखना चाहते हैं तो सबसे प्रासंगिक संदेश है, यानी यदि वे दिनांक टेक्स्ट बॉक्स में "एबीसी" दर्ज करते हैं तो यह संदेश दिखाने के लिए उचित नहीं होगा कि तिथि वैध सीमा में नहीं है (भले ही तकनीकी रूप से मुझे लगता है कि यह सच है)।

वर्तमान में इस प्रकार की कार्यक्षमता प्रदान करने के लिए हम एक कस्टम वैलिडेटर का उपयोग करते हैं और सर्वर के भीतर सभी तीन मान्यताओं को ईवेंट हैंडलर मान्य करते हैं और सत्यापन सत्यापन विफल होने के आधार पर त्रुटि संदेश प्रोग्रामेटिक रूप से बदलते हैं।

मैं इसे थोड़ा और अधिक मानकीकृत करना चाहता हूं क्योंकि यह इस एप्लिकेशन में काफी कुछ होता है, मुझे लगता है कि अगर मैं एक दूसरे पर निर्भर करने वाले वैधकर्ता बना सकता हूं तो यह समस्या का समाधान करेगा और हमें क्लाइंट का उपयोग करने की अनुमति देगा विशेष रूप से कस्टम सत्यापन को संभालने के लिए एक पोस्टबैक करने के बजाय साइड सत्यापन।

विचार यह है कि यदि एक वैधकर्ता दूसरे पर निर्भर करता है तो वह "मास्टर" मान्य है तो निर्भर व्यक्ति सामान्य सत्यापन (मूल्यांकन मूल्यांकन()) कर देगा अन्यथा यदि मास्टर सत्यापनकर्ता मान्य नहीं है तो अन्य आश्रित वैधकर्ता होंगे वैध।

मैं पहले से ही ढांचे में प्रदान किए गए विभिन्न सत्यापनकर्ता नियंत्रणों से विरासत में निम्नलिखित समाधान के साथ आया हूं।

public class RequiredFieldDependentValidator : RequiredFieldValidator 
{ 
    [Description("The validation control to depend on for determining if validation should occur")] 
    public string ValidationControlToDependOn 
    { 
     get 
     { 
      object obj = ViewState["ValidationControlToDependOn"]; 
      if (obj != null) return (string) obj; 
      return null; 
     } 
     set 
     { 
      Control control = FindControl(value); 
      if (control is IValidator) 
       ViewState["ValidationControlToDependOn"] = value; 
      else 
       throw new HttpException("ValidationControlToDependOn is not a validation control"); 
     } 
    } 

    protected override bool EvaluateIsValid() 
    { 
     IValidator validationControlToDependOn = FindControl(ValidationControlToDependOn) as IValidator; 

     if(validationControlToDependOn != null) 
     { 
      return !validationControlToDependOn.IsValid || base.EvaluateIsValid(); 
     } 

     return base.EvaluateIsValid(); 
    } 

वर्तमान में मैं सिर्फ RequiredFieldValidator के लिए यह कोड किया है, आदर्श मैं सत्यापनकर्ता के सभी के लिए इस कार्यक्षमता प्रदान करना चाहते हैं, लेकिन मैं प्रत्येक के लिए एक समान वर्ग में उपरोक्त कोड को कॉपी किए बिना यह करने के लिए एक तरह से नहीं देख सकते हैं व्यक्तिगत प्रकार का सत्यापनकर्ता मैं इस कार्यक्षमता को इस प्रकार प्रदान करना चाहता हूं कि अगर कोई समस्या है तो मुझे वापस जाना होगा और प्रत्येक कोडर प्रकार पर व्यक्तिगत रूप से इस कोड को बदलना होगा।

क्या कोई तरीका है कि मैं इस कोड को "केंद्रीकृत" कर सकता हूं और इसे वैधकर्ताओं में आसानी से उपयोग करने के बिना पूरे सत्यापनकर्ताओं को स्क्रैच से लिखने के लिए उपयोग किया जाता है, इसलिए मैं उस वर्ग को बदल सकता हूं जो वे लाइन के नीचे से प्राप्त करते हैं।

चीयर्स,

उत्तर

0

आप शायद WebControlAdapter में देखना चाहते हैं।

मूल रूप से आपको वेब नियंत्रकों के कुछ तरीकों को ओवरराइड करने की अनुमति देता है (यदि आवश्यक हो तो कुछ ब्राउज़र के लिए सशर्त रूप से, लेकिन यहां सभी के लिए हो सकता है)।

अपने मामले में, आप EvaluateIsValid विधि को ओवरराइड करना चाहते हैं और जांचें कि नियंत्रण में 'पैरेंट' सत्यापनकर्ता पर कोई निर्भरता है या नहीं।

उदाहरण के तौर पर, एक टेक्स्टबॉक्स एडाप्टर जिसे हमने हाल ही में नियंत्रण में 'अधिकतम लम्बाई' विशेषता प्रदान करने के लिए बनाया है।

Public Class TextBoxAdapter 
     Inherits WebControlAdapter 

     Private ReadOnly Property TextBoxControl() As TextBox 
      Get 
       Return DirectCast(MyBase.Control, TextBox) 
      End Get 
     End Property 

     Protected Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter) 
      If TextBoxControl.TextMode = TextBoxMode.MultiLine AndAlso TextBoxControl.MaxLength > 0 Then 
       writer.AddAttribute("maxlength", TextBoxControl.MaxLength.ToString) 
      End If 

      MyBase.RenderBeginTag(writer) 
     End Sub 
    End Class 

, बस अपने App_Browsers निर्देशिका और सेटअप वहाँ अनुकूलक में एक .browser फ़ाइल बनाने के लिए इसका इस्तेमाल करने के लिए:

<browsers> 
    <browser refID="Default"> 
     <controlAdapters> 
      <adapter controlType="System.Web.UI.WebControls.TextBox" 
       adapterType="TextBoxAdapter" /> 
     </controlAdapters> 
    </browser> 
</browsers> 

केवल उलझन है कि अभी भी अपने मामले है कैसे निर्भर सत्यापनकर्ता स्टोर करने के लिए में रहता है EvaluatesValid के लिए इस निर्देशिका तक पहुंचने के लिए। आप एक गैर-प्रस्तुत नियंत्रण पर विचार कर सकते हैं जैसे ओनोफ सुझाए गए या अन्यथा व्यूस्टेट/कुकी/अन्य स्टोरेज तंत्र।

1

आप में आप पेज आधार मान्य विधि रद्द कर सकते थे। पेज में मान्यता निर्भरता जानकारी जोड़ने के लिए आप एक गाया नहीं नियंत्रण लागू कर सकते हैं:

<my:ValidationDependency TargetControl="RegExp1" Dependency="Required1" /> 
0

आप प्रकार सूची के रूप में ValidationControlToDependOn संपत्ति है और सूची में प्रमाणकों जोड़ सकते हैं। तो हम मान सकते हैं कि बाद में जोड़ा गया सत्यापनकर्ता इसके पहले जोड़े गए सत्यापनकर्ता पर निर्भर करता है।

तो अपने protected override bool EvaluateIsValid()

कुछ हद तक

foreach(IValidator validator in ValidationControlToDependOn) 
{ 
return !validator.IsValid; 

} 
+0

क्या यह पिछले पृष्ठ पर निर्भर पृष्ठ पर प्रत्येक सत्यापनकर्ता नहीं करेगा? और मुझे लगता है कि मुझे अभी भी प्रत्येक सत्यापनकर्ता –

0

मैं जो यह की तरह लगता है होनहार हो सकता है नियंत्रण extenders में देख रहा हूँ बदल जाएगा, लेकिन मैं कुछ भी लेकिन इसके साथ AJAX के सामान कर के कई उदाहरण नहीं मिल सकता है।

+0

को उपclass करने की आवश्यकता होगी, लेकिन मैंने विस्तारित नियंत्रण की विधि को ओवरराइड नहीं किया है। आईएमओ सबक्लासिंग से बचने का एकमात्र तरीका पृष्ठ को ओवरराइड करना है। वैध()। – onof