Modo elegante per far funzionare CustomValidator con la finestra di messaggio ValidationSummary

StackOverflow https://stackoverflow.com/questions/811734

Domanda

Ho riscontrato questo problema prima ma non l'ho mai risolto del tutto. Ho un modulo con diversi validatori e anche un 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]+)
protected void cvMemberNum_Validate(object source, ServerValidateEventArgs args)
{
    try
    {
        args.IsValid  = (!CampaignRegistration.IsMemberRegistered(args.Value));
    }
    catch
    {
        args.IsValid = false;
    }
}
quot; >*</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" />

e sul lato server:

<*>

Il mio problema è: ValidationSummary non mostra mai il messaggio da CustomValidator. Questa domanda è stata posta in diversi punti, ma non ho mai visto una risposta soddisfacente.

È stato utile?

Soluzione

Prova a utilizzare una proprietà ValidationGroup su tutti i tuoi validatori e ValidationSummary.

MODIFICA: Un'altra possibilità potrebbe essere il codice di convalida del server

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

se CampaignRegistration.IsMemberRegistered (args.Value) restituisce false, "! " lo sta rendendo vero e quindi rendendolo valido. Penso che dovresti sbarazzarti del "! & Quot; come segue:

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

AGGIORNAMENTO: Affinché ValidationSummary visualizzi il messaggio del validatore personalizzato in una finestra di messaggio, devi avere ClientValidationFunction Codice. Se è necessario visualizzare solo il riepilogo senza un popup, questo non è necessario.

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

ALTRO: Se non si desidera eseguire la convalida lato client, provare questo trucco per mostrare l'avviso. Apporta questa modifica al tuo metodo 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>"); 

    }

}

Altri suggerimenti

ShowMessageBox è completamente lato client, pertanto valuterà solo se è stata impostata l'opzione ClientValidationFunction in CustomValidator .

Puoi anche simularlo registrando uno script che fa un avviso, quindi quando torni dalla convalida del server, ti verrà richiesto con il messaggio di errore. Questo può essere registrato nel metodo ServerValidate (per @Jose Basilio ) oppure puoi chiamare il seguente metodo durante l'evento PreRender per registrare un popup con tutti i validatori non validi nella pagina:

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

Di recente ho avuto lo stesso problema. ValidationSummary non mostrava ErrorMessage da CustomValidator quando ServerValidate ha dichiarato l'errore di convalida. Poiché per impostazione predefinita (come mostrato dalla mia piccola ingegneria inversa), il riepilogo della convalida viene visualizzato sul lato client al postback, ho semplicemente aggiunto uno script che controlla tutti i validatori sul caricamento del documento / completamento postback asincrono e avvia la creazione del riepilogo della convalida per gruppi di convalida falliti:

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

Nel mio scenario avevo controlli utente nidificati con validatori, pannello di aggiornamento e riepilogo di convalida nella pagina principale.

Maggiori dettagli qui.

Devi scrivere una proprietà

ValidationGroup = " ValidationSummary1 "

in ogni validatore nel tuo caso.

Controlla anche se la tua pagina ha

AutoEventWireup="true"

Questo ha funzionato per me:

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

RegisterServerValidationMessageScript di bduke lo sta "fingendo", ma non lo è. Risolve davvero il problema. Ogni spazio dei nomi di Utility necessita di questa funzione da qualche parte.

Ho trovato una soluzione alternativa per quando javascript è disabilitato e ValidationSummary non mostra la proprietà errorMessage di CustomValidator . Ciò è necessario poiché l'iniezione di script o avvisi, come descritto sopra, non funzionerà.

Aggiungi un nuovo controllo Validator, chiamiamolo CustomValidatorProxy , imposta la proprietà ControlToValidate su uno dei controlli nel modulo e EnableClientScript = false .

All'interno del gestore di eventi ServerValidate esegui la convalida personalizzata e se la convalida non riesce imposta la proprietà IsValid su CustomValidator e CustomValidatorProxy su false e allo stesso modo impostare entrambe le proprietà ErrorMessage .

Se viene passata la convalida in ServerValidate , assicurarsi che la proprietà IsValid di CustomValidatorProxy sia impostata su true.

A condizione che il CustomValidatorProxy sia prima del CustomValidator nel ValidatorCollection della Pagina, il gestore ServerValidate sostituirà il IsValid valore della proprietà che CustomValidatorProxy avrebbe restituito dopo aver convalidato il valore ControlToValidate e il tuo ErrorMessage dal tuo CustomValidator essere visualizzato in ValidationSummary .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top