19 Stimmen

Eleganter Weg, um CustomValidator mit ValidationSummary messagebox arbeiten zu lassen

Ich hatte dieses Problem schon einmal, habe es aber nie ganz gelöst. Ich habe ein Formular mit mehreren Validatoren und auch einen CustomValidator.

<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" />

und auf der Serverseite:

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

Mein Problem ist: Die ValidationSummary zeigt nie die Nachricht von CustomValidator. Diese Frage wurde schon an mehreren Stellen gestellt, aber ich habe keine zufriedenstellende Antwort gesehen.

10voto

Jose Basilio Punkte 49489

Versuchen Sie, eine ValidationGroup-Eigenschaft für alle Ihre Validatoren und die ValidationSummary zu verwenden.

EDITAR: Eine weitere Möglichkeit könnte der Server Validation Code sein

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

wenn CampaignRegistration.IsMemberRegistered(args.Value) ist falsch, "!" macht es wahr und damit gültig. Ich denke, Sie sollten das "!" wie folgt loswerden:

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

UPDATE: Damit ValidationSummary Ihre benutzerdefinierte Validierungsnachricht in einer Messagebox anzeigen kann, müssen Sie ClientValidationFunction Code. Wenn Sie nur die Zusammenfassung ohne ein Popup-Fenster anzeigen möchten, ist dies nicht erforderlich.

<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
   }

MEHR: Wenn Sie die ClientSide-Validierung nicht durchführen wollen, können Sie mit diesem Trick die Warnung anzeigen. Nehmen Sie diese Änderung an Ihrer CustomValidator ServerValidate-Methode vor:

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>"); 

    }

}

7voto

bdukes Punkte 144019

En ShowMessageBox Option ist vollständig clientseitig, d.h. sie wird nur ausgewertet, wenn Sie die ClientValidationFunction über die CustomValidator .

Sie können es auch vortäuschen, indem Sie ein Skript registrieren, das eine Warnung ausgibt, so dass Sie nach der Validierung des Servers eine Fehlermeldung erhalten. Dies kann entweder in der Methode ServerValidate registriert werden (per @Jose Basilio ), oder Sie können die folgende Methode während des PreRender-Ereignisses aufrufen, um ein Popup mit allen ungültigen Validatoren auf der Seite zu registrieren:

    /// <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);
            }
        }
    }

5voto

Maxim Saplin Punkte 2909

Ich hatte kürzlich das gleiche Problem. ValidationSummary zeigte die ErrorMessage von CustomValidator nicht an, wenn ServerValidate einen Überprüfungsfehler meldete. Da standardmäßig (wie meine kleine Reverse Engineering zeigte) Validierung Zusammenfassung Client-Seite auf Postback gerendert wird, habe ich einfach ein Skript hinzugefügt, das alle Validatoren auf Dokument laden/async Postback Abschluss prüft und Validierung Zusammenfassung Erstellung für fehlgeschlagene Validierung Gruppen auslöst:

$(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();
                    });
}
);

In meinem Szenario hatte ich verschachtelte Benutzerkontrollen mit Validatoren, Aktualisierungspanel und Validierungszusammenfassung auf der übergeordneten Seite.

Weitere Einzelheiten finden Sie hier.

1voto

Iralda Mitro Punkte 6994

Sie sollten eine Eigenschaft schreiben

ValidationGroup="ValidationSummary1"

bei jedem Prüfer in Ihrem Fall.

Prüfen Sie auch, ob Ihre Seite

AutoEventWireup="true"

1voto

user487779 Punkte 492

Ich habe einen Workaround gefunden, wenn Javascript deaktiviert ist und die ValidationSummary zeigt nicht die errorMessage Eigenschaft der CustomValidator . Dies ist erforderlich, da das Einfügen von Skripten oder Warnmeldungen, wie oben beschrieben, nicht funktionieren wird.

Fügen Sie ein neues Validator-Steuerelement hinzu, nennen wir es CustomValidatorProxy setzen Sie seine ControlToValidate auf eines der Steuerelemente des Formulars und EnableClientScript=false .

Innerhalb der ServerValidate Ereignisbehandlungsroutine führen Sie Ihre benutzerdefinierte Validierung durch und wenn die Validierung fehlschlägt, setzen Sie die IsValid Eigenschaft der CustomValidator y CustomValidatorProxy auf false setzen und in ähnlicher Weise die beiden ErrorMessage Eigenschaften.

Wenn die Validierung in der ServerValidate übergeben wird, stellen Sie sicher, dass die Eigenschaft IsValid der Datei CustomValidatorProxy auf "wahr" gesetzt ist.

Vorausgesetzt, die CustomValidatorProxy liegt vor dem CustomValidator im ValidatorCollection der Seite, dann überschreibt der ServerValidate-Handler die IsValid Eigenschaftswert, den die CustomValidatorProxy zurückgegeben hätte, nachdem es die ControlToValidate Wert und Ihr ErrorMessage von Ihrem CustomValidator wird im Fenster ValidationSummary .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X