2008-11-06 8 views
18

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

मैं .NET 2.0

का उपयोग कर रहा हूं यह क्या हो सकता है?

+4

धन्यवाद, मुझे अभी एक समस्या मिली है जो मुझे नहीं पता था कि मेरे पास था! – JasonS

उत्तर

17

एफडब्ल्यूआईडब्ल्यू, यदि आप पासवर्ड बॉक्स को कंट्रोल टॉवालिडेट करते हैं, और कन्फर्म पासवर्ड बॉक्स को कंट्रोल टॉम कॉम्पैयर करते हैं, तो यह काम करेगा क्योंकि पासवर्ड बॉक्स में कुछ होगा और इसलिए सत्यापन चलाएगा।

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

+1

अच्छा और सरल समाधान ... अंगूठे ऊपर! – reSPAWNed

5

आपको एक आवश्यक फ़ील्ड वैलिडेटेटर का उपयोग करने की भी आवश्यकता है। फ़ील्ड खाली होने पर बहुत से सत्यापन नियंत्रण पास होंगे और आवश्यक फ़ील्ड वैलिडेटर के साथ इस तरह जोड़ा जाना चाहिए।

+1

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

0

तुलना वैलिडेटर, रेगुलरएक्सप्रेसियन वैलिडेटेटर और रेंज वैलिडेटर सत्यापन नियंत्रण गैर-खाली स्ट्रिंग मानों पर काम कर रहे हैं। यह उन परिस्थितियों के लिए उपयोगी है जहां हमारे पास एक गैर-आवश्यक फ़ील्ड है जिसे दर्ज करते समय कुछ शर्त को पूरा करने की आवश्यकता होती है।

उदाहरण के लिए हमारे पास दो फ़ील्ड के साथ एक फॉर्म है: प्राथमिक ईमेल जो दर्ज किया जाना चाहिए; और वैकल्पिक ईमेल जो आवश्यक नहीं है लेकिन दर्ज किए जाने पर इसे सत्यापित किया जाना चाहिए। इसे प्रमाणित करने के लिए हम प्राथमिक फ़ील्ड और केवल RegularExpressionValidator को दूसरे फ़ील्ड में RequiredFieldValidator और RegularExpressionValidator जोड़ देंगे।

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

3

इस बारे में कैसे?

दो टेक्स्टबॉक्स फ़ील्ड - txtEmail1 (ईमेल पते के लिए) और txtEmail2 (पुष्टि के लिए)।

txtEmail1 पर एक नियमित एक्सप्लोरेशन वैलिडेटर संलग्न करें - खाली होने पर, यह आग नहीं लगेगा। जब आबादी, आपका डेटा मान्य है।

txtEmail1 पर तुलना करने के लिए एक तुलना वैलिडेटर संलग्न करें, इसकी डेटा txtEmail2 से तुलना करें। फिर, एक तुलना वैलिडेटर को txtEmail2 से संलग्न करें, इसकी डेटा को txtEmail1 से तुलना करें।

  • जब दोनों फ़ील्ड खाली होते हैं, तो तीन वैधकर्ताओं में से कोई भी आग नहीं लगाएगा।
  • जब txtEmail1 से भर जाता है, यह रेगुलर एक्सप्रेशन से मेल चाहिए, और यह txtEmail2 से मेल खाना चाहिए
  • जब txtEmail2 से भर जाता है, यह txtEmail1 से मेल खाना चाहिए

यह आपकी आवश्यकता है कि खेतों खाली छोड़ा जा सकता को पूरा करती है, लेकिन यदि फ़ील्ड में डेटा है तो सत्यापन तर्क को सक्रिय करता है।

- जो

+0

आपको एक और +1 देगा यदि मैं – mrd3650

6

मुझे एक ही समस्या थी। तुलना वैलिडेटर के बजाय कस्टम वैलिडेटर का उपयोग करें। (कस्टम वैलिडेटेटर में सहायक सहायता है जिसे ValidateEmptyText कहा जाता है, जो तुलनात्मक रूप से ASP.NET 2.0 में तुलनात्मकता की कमी है।)

आपको एक उचित सर्वर वैलिडेट फ़ंक्शन, साथ ही क्लाइंट वैलिडेशन फ़ंक्शन भी प्रोग्राम करने की आवश्यकता होगी। जावास्क्रिप्ट फ़ंक्शन के लिए फ़ंक्शन हस्ताक्षर मूल रूप से सर्वर वैलिडेट फ़ंक्शन के समान होता है: स्रोत (ऑब्जेक्ट), args (ServerValidateEventArgs)।

सबसे कठिन हिस्सा यह है कि आपको "तुलनात्मक" टेक्स्टबॉक्स तक पहुंचने के लिए कस्टम कोड लिखना होगा, क्योंकि यह कस्टम वैलिडेटर का हिस्सा नहीं है। मेरे क्षेत्र फॉर्मव्यू के भीतर थे; आपको अपनी विशेष परिस्थितियों में फिट करने के लिए कोड को समायोजित करने की आवश्यकता हो सकती है। नीचे दिए गए कोड में, "एफवी" उस फॉर्म व्यू का नाम है।

क्लाइंट-साइड सत्यापन:

<script type="text/javascript"> 
<!-- 
    function cvPasswordRpt_Validate(source, args) 
    { 
    args.IsValid = (args.Value == 
        document.getElementsByName("fv$tbPassword").item(0).value); 
    } 
//--> 
</script> 

ASPX कोड:

<label>New Password:</label> 
<asp:TextBox ID="tbPassword" runat="server" CssClass="stdTextField" 
      TextMode="Password" ValidationGroup="edit" /> 
<br /> 
<label>Repeat New Password:</label> 
<asp:TextBox ID="tbPasswordRpt" runat="server" CssClass="stdTextField" 
      TextMode="Password" ValidationGroup="edit" /> 
<asp:CustomValidator ID="cvPasswordRpt" runat="server" Display="Dynamic" 
      EnableClientScript="true" ValidationGroup="edit" 
      ControlToValidate="tbPasswordRpt" ValidateEmptyText="true" 
      ErrorMessage="Your passwords do not match." 
      ClientValidationFunction="cvPasswordRpt_Validate" 
      OnServerValidate="cvPasswordRpt_ServerValidate" /> 

सर्वर-साइड सत्यापन (VB.NET):

Protected Sub cvPasswordRpt_ServerValidate(ByVal sender As Object, 
              ByVal e As ServerValidateEventArgs) 
    Dim _newPassword As String = DirectCast(fv.FindControl("tbPassword"), 
              TextBox).Text 
    e.IsValid = e.Value.Equals(_newPassword) 
End Sub 
+0

कर सकता था तो मुझे बिल्कुल वही समस्या थी और इस उदाहरण ने मुझे एमएसडीएन, चीयर्स पर लंगड़ा दस्तावेज पढ़ने के बिना इसे हल करने की अनुमति दी! – daddywoodland

0

मैं एक ही समस्या थी और करने की कोशिश की Patmortech का उत्तर जो काम करता है लेकिन तुलनात्मक सत्यापनकर्ता को उपयोगकर्ता के पुष्टिकरण टेक्स्टबॉक्स में टाइप करने से पहले दिखाता है (क्लाइंट साइड का उपयोग करते समय सत्यापन) तो बिल्कुल सही नहीं है।

इसके बजाय मैंने एक कस्टम सत्यापनकर्ता को खारिज कर दिया जो केवल पासवर्ड बॉक्स में कुछ दर्ज होने पर तुलना करता है। नीचे दिए गए कोड के मामले में अगर किसी अन्य व्यक्ति के लिए इसका उपयोग किया जाता है जो एक ही मुद्दे को देखते हुए इस पर आता है। अपनी आवश्यकताओं के अनुसार पासवर्ड बॉक्स पर आवश्यक फ़ील्ड सत्यापनकर्ता के साथ या उसके बिना इस सत्यापनकर्ता का उपयोग करें।

public class CompareIfRequiredPasswordValidator : BaseValidator 
{ 
    private const string SCRIPTBLOCK = "UNIQUE1"; 

    private string controlToCompare; 

    [Browsable(true)] 
    [Category("Behavior")] 
    [DefaultValue("")] 
    [IDReferenceProperty] 
    public string ControlToCompare 
    { 
     get { return controlToCompare; } 
     set { controlToCompare = value; } 
    } 

    /// <summary> 
    /// Server side validation function 
    /// </summary> 
    /// <returns></returns> 
    protected override bool EvaluateIsValid() 
    { 
     TextBox txCompare = (TextBox)FindControl(ControlToValidate); 
     TextBox txPassword = (TextBox)FindControl(ControlToCompare); 
     if (txPassword.Text.Length == 0) 
     { 
      //No password entered so don't compare 
      return true; 
     } 
     else 
     { 
      if (txCompare.Text == txPassword.Text) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 
     if (EnableClientScript) { this.ClientScript(); } 

    } 

    //Add the custom attribute here 
    protected override void AddAttributesToRender(HtmlTextWriter writer) 
    { 
     base.AddAttributesToRender(writer); 
     if (this.RenderUplevel) 
     { 
      Page.ClientScript.RegisterExpandoAttribute(this.ClientID, "controltocompare", base.GetControlRenderID(ControlToCompare)); 
     } 
    } 

    //Generate and register the script for client side validation 
    private void ClientScript() 
    { 
     StringBuilder sb_Script = new StringBuilder(); 
     sb_Script.Append("<script language=\"javascript\">"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("function pw_verify(sender) {"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("var txCompare = document.getElementById(document.getElementById(sender.id).controltovalidate);"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("var txPassword = document.getElementById(document.getElementById(sender.id).controltocompare);"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("if (txPassword.value == '')"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("{"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("return true;"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("}"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("else"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("{"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("if (txCompare.value == txPassword.value)"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("{"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("return true;"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("}"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("else"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("{"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("return false;"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("}"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("}"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("}"); 
     sb_Script.Append("\r"); 
     sb_Script.Append("</script>"); 
     Page.ClientScript.RegisterClientScriptBlock(GetType(), SCRIPTBLOCK, sb_Script.ToString()); 
     Page.ClientScript.RegisterExpandoAttribute(ClientID, "evaluationfunction", "pw_verify"); 
    } 
} 
0

मैं यह करने की कोशिश की: (! Patmortech, बहुत धन्यवाद द्वारा)

Fwiw, अगर आप पासवर्ड बॉक्स ControlToValidate, और पुष्टि पासवर्ड बॉक्स ControlToCompare बनाने, तो यह काम करेंगे क्योंकि पासवर्ड बॉक्स में कुछ होगा और इसलिए सत्यापन चलाएगा।

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

खाली पासवर्ड और भरे हुए पुष्टि बॉक्स छोड़ने से बचने के लिए, मैं सिर्फ डाल एक और बदली ControlToValidate और ControlToCompare मूल्यों के साथ पासवर्ड बॉक्स पर सत्यापनकर्ता की तुलना करें।

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

  • कोई संबंधित समस्या नहीं^_^