2012-06-16 17 views
9

काम नहीं कर रहा CustomValidator मैं एएसपी का निम्न भाग है:अच्छी तरह से

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
     ValidationGroup="RegisterUserValidationGroup"/> 

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label> 
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox> 
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
     ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server" 
     CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup"> 
    *</asp:RegularExpressionValidator> 
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
     ValidationGroup="RegisterUserValidationGroup" OnServerValidate="UserValidate">*</asp:CustomValidator> 

और फिर समारोह:

protected void UserValidate(object source, ServerValidateEventArgs args) 
    { 
     SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'"; 
     DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty); 
     if (dv.Table.Rows.Count != 0) 
      args.IsValid = false; 
     else 
      args.IsValid = true; 
    } 

बटन:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
     ValidationGroup="RegisterUserValidationGroup" 
     onclick="CreateUserButton_Click"/> 

समस्या यह है कि कस्टम सत्यापनकर्ता फ़ंक्शन को बुलाया जाता है और .IsValid को झूठी, पर सेट करता है, बटन तर्क अभी भी चलता है!

+0

मैं अगर यह कुछ भी लायक है यकीन है कि नहीं हूँ, लेकिन मैं भी स्थापित करने के लिए NoUserValidator.IsValid = false – RanH

+0

मैं अपने मार्कअप में बटन दिखाई नहीं देता, लेकिन यकीन है कि यह अपने ValidationGroup अपने RegisterUserValidationGroup पर सेट है बनाने की कोशिश की। – Gloopy

+0

मैंने संदेश – RanH

उत्तर

11

बटन के लिए अपने onclick समारोह में, देखने के लिए एक जांच जोड़ने अगर पेज वैध

protected void CreateUserButton_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     // Create the user 
    } 
} 

कि यह करना चाहिए है। ऐसा इसलिए है क्योंकि आपके कस्टम सत्यापनकर्ता को पोस्टबैक के दौरान, सर्वर पर मान्य करने के लिए सेट अप किया गया है। क्या होता है कि कोड पहले सत्यापनकर्ता कोड UserValidate चलाता है, जहां आप IsValid ध्वज सेट करते हैं। पोस्टबैक स्टैक में अगला बटन का ऑनक्लिक फ़ंक्शन है। यह फ़ंक्शन वैधता फ़ंक्शन में परिणाम के बावजूद चलाएगा, इसलिए यह है कि आपको IsValid ध्वज के मान की जांच करने की आवश्यकता है। यह तब व्यवहार होता है जब आप सर्वर पक्ष पर कस्टम सत्यापन नियंत्रण को मान्य करते हैं।

क्लाइंट पक्ष पर मान्य करने का एक विकल्प है। यदि आप अपने ब्राउज़र द्वारा उत्पन्न पृष्ठ स्रोत कोड देखते हैं, तो आप देखेंगे कि जावास्क्रिप्ट RegularExpressionValidator के लिए जोड़ा गया है। इसका व्यवहार ज्ञात है, और क्लाइंट पक्ष पर संभाला जाता है, इसलिए अभिव्यक्ति का मूल्यांकन करने और पृष्ठ को सत्यापित करने के लिए कोई पोस्ट बैक आवश्यक नहीं है (यह सब जावास्क्रिप्ट द्वारा संभाला जाता है)। कस्टम सत्यापनकर्ता फ़ंक्शन ज्ञात नहीं है, इसलिए जब तक आप क्लाइंट-साइड सत्यापन स्क्रिप्ट को परिभाषित नहीं करते हैं, तब तक एक पोस्टबैक आवश्यक होता है।

MSDN पर अधिक जानकारी के लिए यहां एक लिंक दिया गया है।

+1

पर बटन कोड जोड़ा है धन्यवाद, इसे ठीक किया गया है, क्या आप समझा सकते हैं कि यह अन्य वैधताओं के साथ ठीक क्यों काम करता है, और कस्टम के लिए मुझे जो लिखा है उसे जोड़ना था? – RanH

+1

दरअसल, मुझे यकीन नहीं है, इसलिए मैं अनुमान लगाने जा रहा हूं, लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि अन्य वैधकर्ता क्लाइंट पक्ष पर मान्य हैं, जबकि कस्टम सत्यापनकर्ता सर्वर पक्ष को मान्य कर रहा है। चूंकि यह सर्वर की तरफ है, इसलिए पोस्टबैक पहले ही शुरू हो चुका है, और आप पहले अपने कस्टम सत्यापनकर्ता को निष्पादित कर रहे हैं, फिर बटन का क्लिक फ़ंक्शन। क्या इसका कोई मतलब है? –

+0

जिस तरीके से आप इसका वर्णन करते हैं, वह समझ में आता है, लेकिन मैं उम्मीद करता हूं कि पेज जारी रखने से पहले सभी वैधताओं की स्वीकृति के लिए प्रतीक्षा करें, और अन्य सभी को runat = सर्वर के लिए भी कॉन्फ़िगर किया गया है, लेकिन हो सकता है कि इससे कोई फर्क नहीं पड़ता? – RanH

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