2009-05-01 14 views
19

मैंने पहले इस समस्या में भाग लिया है लेकिन इसे हल नहीं किया है। मेरे पास कई सत्यापनकर्ताओं और कस्टम वैलिडेटर के साथ एक फॉर्म है।कस्टम वैलिडेटर को सत्यापन के साथ काम करने का सुरुचिपूर्ण तरीकासमूह संदेश संदेश

<asp:Label ID="lblMemberNum" runat="server" Text="Membership #:" CssClass="LabelMedium" ></asp:Label> 
<asp:TextBox ID="txtMemberNum" runat="server" CssClass="TextBox" ></asp:TextBox> 
<asp:RequiredFieldValidator ID="rfvMemberNum" SetFocusOnError="True" runat="server" 
    ControlToValidate="txtMemberNum" ErrorMessage="[ Membership # ] is required" 
    CssClass="ValidationMessage" Display="Dynamic" >*</asp:RequiredFieldValidator> 
<asp:RegularExpressionValidator ID="revMemberNum" Display="Dynamic" runat="server" 
    ControlToValidate="txtMemberNum" CssClass="ValidationMessage" 
    ErrorMessage="[ Membership # ] can only contain letters" 
    ValidationExpression="^([a-zA-Z\d]+)$" >*</asp:RegularExpressionValidator> 
<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic" 
    ControlToValidate="txtMemberNum" ValidateEmptyText="false" 
    OnServerValidate="cvMemberNum_Validate" 
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator> 

<asp:ValidationSummary ID="ValidationSummary1" runat="server" 
    CssClass="ValidationMessage" 
    ShowMessageBox="True" ShowSummary="False" /> 

और सर्वर साइड पर:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args) 
{ 
    try 
    { 
     args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); 
    } 
    catch 
    { 
     args.IsValid = false; 
    } 
} 

मेरे समस्या है: ValidationSummary कभी नहीं CustomValidator से संदेश को दर्शाता है। इस सवाल से कई स्थानों पर पूछा गया है, लेकिन मैंने एक संतोषजनक उत्तर देखा है।

उत्तर

10

अपने सभी वैधताओं और सत्यापन प्रमाणीकरण में एक सत्यापन समूह का उपयोग करने का प्रयास करें।

संपादित करें: "" सर्वर सत्यापन एक और संभावना है हो सकता है कोड

args.IsValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); 

अगर झूठी लौटा रहा है, यह सच बना रहा है और इसलिए इसे वैध बना रहा है। मुझे लगता है कि आपको "!" से छुटकारा पाना चाहिए इस प्रकार है:

args.IsValid = CampaignRegistration.IsMemberRegistered(args.Value); 

अद्यतन: आदेश ValidationSummary एक messagebox में अपने कस्टम सत्यापनकर्ता संदेश को प्रदर्शित करने के लिए है, तो आप ClientValidationFunction कोड की आवश्यकता है। यदि आपको पॉपअप के बिना सारांश को प्रदर्शित करने की आवश्यकता है, तो इसकी आवश्यकता नहीं है।

<asp:CustomValidator ID="cvMemberNum" runat="server" 
    CssClass="ValidationMessage" Display="Dynamic" 
    ControlToValidate="txtMemberNum" ValidateEmptyText="false" 
    OnServerValidate="cvMemberNum_Validate" 
    ClientValidationFunction = "ClientValidate" 
    ErrorMessage="This membership number is already registered">*</asp:CustomValidator> 
    //JavaScript Code. 
    function ClientValidate(source, args) 
    {   
     args.IsValid = false; //you need to add validation logic here 
    } 

अधिक: आप clientside मान्यता नहीं करना चाहते हैं, चेतावनी दिखाने के लिए इस चाल का प्रयास करें। अपने CustomValidator ServerValidate विधि में यह परिवर्तन करने:

protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args) 
{ 
    bool isValid = true; 
    try 
    { 
     isValid = (!CampaignRegistration.IsMemberRegistered(args.Value)); 
    } 
    catch 
    { 
     isValid = false; 
    } 
    args.IsValid = isValid; 

    if(!isValid) 
    { 
     if(!Page.IsClientScriptBlockRegistered("CustomValidation")) 
     Page.RegisterClientScriptBlock("CustomValidation", "<script>alert('This membership number is already registered');</script>"); 

    } 

} 
+0

मुझे पूरा यकीन है कि समस्या नहीं है। हालांकि, मैं कोशिश करूँगा और रिपोर्ट करूंगा। –

+0

मैंने अवलोकन करने के बाद अपनी पोस्ट अपडेट की। कृपया पुष्टि करें। –

+0

आपके द्वारा हाइलाइट किया गया कोड वास्तव में ठीक है। यदि उपयोगकर्ता पहले ही पंजीकृत है तो प्रमाणीकरण विफल हो जाता है। वह हिस्सा काम करता है। क्या होता है, '*' टेक्स्टबॉक्स के बगल में दिखाई देता है, लेकिन प्रमाणीकरणसमरी संदेशबॉक्स प्रस्तुत नहीं करती है। –

1

आप अपने मामले में हर सत्यापनकर्ता में एक संपत्ति

ValidationGroup="ValidationSummary1"

लिखना चाहिए।

यह भी जांच करता है, तो अपने पृष्ठ

AutoEventWireup="true" 
+0

कस्टम वैलिडेटर वास्तव में सर्वर साइड कोड को मान्य और निष्पादित करता है। जब अमान्य होता है, तो यह टेक्स्टबॉक्स के बगल में अपना टेक्स्ट ("*") दिखाता है। हालांकि, प्रमाणीकरणसमरी अन्य संदेश दिखाती है लेकिन कस्टम वैलिडेटर से नहीं। –

+0

बस इन दो निर्देशों को आजमाएं, और मुझे बताएं। क्योंकि मेरे पास बिल्कुल वही मामला है, और कस्टम सत्यापनकर्ता का संदेश मान्यताओं में दिखाया गया है – DaDa

+0

आपकी प्रतिक्रिया DaDa के लिए धन्यवाद। हो सकता है कि मुझे यह स्पष्ट करना चाहिए कि प्रमाणीकरणसमारी कस्टम वैलिडेटर से त्रुटि दिखाती है IF ShowSummary = "true" सेट करें। समस्या तब होती है जब मैं एक संदेशबॉक्स दिखाना चाहता हूं। –

7

ShowMessageBox विकल्प पूरी तरह से क्लाइंट-साइड है, तो यह केवल का मूल्यांकन करेंगे अगर आप CustomValidator पर ClientValidationFunction निर्धारित किया है।

आप एक स्क्रिप्ट पंजीकृत करके नकली भी बना सकते हैं जो चेतावनी देता है, इसलिए जब आप सर्वर के सत्यापन से वापस आते हैं, तो यह त्रुटि संदेश से संकेत देगा। यह या तो (@Jose Basilio प्रति) ServerValidate विधि में पंजीकृत किया जा सकता है, या आप पृष्ठ पर सभी अवैध प्रमाणकों के साथ एक पॉपअप रजिस्टर करने के लिए पूर्वप्रस्तुत घटना के दौरान निम्न विधि कॉल कर सकते हैं:

/// <summary> 
    /// Registers a script to display error messages from server-side validation as the specified <see cref="UserControl"/> or <see cref="Page"/> loads from a postback. 
    /// </summary> 
    /// <remarks> 
    /// Must be called in the PreRender if used to validate against the Text property of DNNTextEditor controls, otherwise Text will not be populated. 
    /// Must set the ErrorMessage manually if using a resourcekey, otherwise the resourcekey will not have overridden the ErrorMessage property. 
    /// </remarks> 
    /// <param name="ctrl">The <see cref="UserControl"/> or <see cref="Page"/> which is being posted back.</param> 
    /// <param name="validationGroup">The validation group against which to validate.</param> 
    public static void RegisterServerValidationMessageScript(TemplateControl ctrl, string validationGroup) 
    { 
     if (ctrl != null && ctrl.Page.IsPostBack) 
     { 
      ctrl.Page.Validate(validationGroup); 
      if (!ctrl.Page.IsValid) 
      { 
       StringBuilder errorMessage = new StringBuilder("<script language='javascript'>alert('"); 
       for (int i = 0; i < ctrl.Page.Validators.Count; i++) 
       { 
        IValidator validator = ctrl.Page.Validators[i]; 
        if (!validator.IsValid) 
        { 
         errorMessage.Append("- " + validator.ErrorMessage); 
         if (i < ctrl.Page.Validators.Count - 1) 
         { 
          errorMessage.Append(@"\r\n"); 
         } 
        } 
       } 

       errorMessage.Append("');</script>"); 
       ctrl.Page.ClientScript.RegisterStartupScript(typeof(IValidator), "validationAlert", errorMessage.ToString(), false); 
      } 
     } 
    } 
+0

धन्यवाद बहुत कम! एक जादू की तरह काम करता है! –

+0

इस समय केवल समस्या है, मुझे कस्टम जेएस प्रस्तुत करने की अनुमति नहीं है। –

1

यह मेरे लिए काम किया:

<asp:CustomValidator runat="server" ID="cv" 
ClientValidationFunction="ValidateFunction" 
ErrorMessage="Default error 
message">*</asp:CustomValidator> 

<script type="text/javascript"> 
function ValidateFunction(sender, args) 
{ 

var msg =''; 
var formValid = true; 

[various checks setting msg and formValid] 

if (msg.length > 0) { sender.errormessage = msg; } 
args.IsValid = formValid; 

} 
</script> 
5

मुझे हाल ही में एक ही समस्या है। प्रमाणीकरणसमारी कस्टम वैलिडेटर से त्रुटि संदेश नहीं दिखा रहा था जब सर्वर वैलिडेट ने सत्यापन विफलता कहा था।चूंकि डिफ़ॉल्ट रूप से (जैसा कि मेरी छोटी रिवर्स इंजीनियरिंग दिखाती है) सत्यापन सारांश को पोस्टबैक पर क्लाइंट साइड प्रदान किया जाता है मैंने बस एक स्क्रिप्ट जोड़ दी है जो दस्तावेज़ लोड/एसिंक पोस्टबैक पूर्णता पर सभी वैधताओं की जांच करता है और असफल सत्यापन समूहों के लिए सत्यापन सारांश निर्माण ट्रिगर करता है:

$(document).ready(function() { 
    var displayAlert = function() { 
     if (typeof Page_Validators == 'undefined') return; 

     var groups = []; 
     for (i = 0; i < Page_Validators.length; i++) 
      if (!Page_Validators[i].isvalid) { 
       if (!groups[Page_Validators[i].validationGroup]) { 
        ValidationSummaryOnSubmit(Page_Validators[i].validationGroup); 
        groups[Page_Validators[i].validationGroup] = true; 
       } 
      } 
    }; 

    displayAlert(); 

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
        function() { 
         displayAlert(); 
        }); 
} 
); 

मेरे परिदृश्य में मैंने मूल पृष्ठ पर सत्यापनकर्ताओं, अद्यतन पैनल और सत्यापन सारांश के साथ उपयोगकर्ता नियंत्रण निहित किया था।

More details here.

1

मैं जब जावास्क्रिप्ट अक्षम किया गया है के लिए एक समाधान मिल गया है और ValidationSummaryCustomValidator की errorMessage संपत्ति नहीं दिखाती है। ऊपर वर्णित अनुसार, स्क्रिप्ट या अलर्ट इंजेक्शन के रूप में यह आवश्यक है, काम नहीं करेगा।

एक नया सत्यापनकर्ता नियंत्रण जोड़ें, चलो यह CustomValidatorProxy कॉल, प्रपत्र पर नियंत्रण के किसी भी एक और EnableClientScript=false करने के लिए अपने ControlToValidate गुण सेट।

ServerValidate ईवेंट हैंडलर के भीतर अपने कस्टम सत्यापन की जाएगी तथा यदि सत्यापन झूठी है और इसी तरह सेट दोनों ErrorMessage गुणों के CustomValidator और CustomValidatorProxy की IsValid गुण सेट विफल रहता है।

यदि ServerValidate में सत्यापन पारित किया गया है तो सुनिश्चित करें कि CustomValidatorProxy की IsValid संपत्ति सत्य पर सेट है।

परंतु CustomValidatorProxy है पहले पृष्ठ का ValidatorCollection में CustomValidator तो ServerValidate हैंडलर IsValid संपत्ति के मूल्य कि CustomValidatorProxyControlToValidate मूल्य और अपने ErrorMessage अपने CustomValidator से मान्य होने वापस आ गए हैं ValidationSummary में प्रदर्शित किया जाएगा पार कर जाएगी ।

+2

यदि आप दिखाए गए थे तो आप क्या कर रहे हैं और अधिक पठनीय होगा –

1

bduke's RegisterServerValidationMessageScript "इसे पकाना" है, लेकिन ऐसा नहीं है। यह वास्तव में समस्या को हल करता है। प्रत्येक उपयोगिता नामस्थान को इस समारोह को कहीं और चाहिए।

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