2009-05-01 5 views
19

Ho incontrato questo problema in precedenza ma non l'ho mai risolto del tutto. Ho un modulo con diversi validatori e anche un CustomValidator.Modo elegante per far funzionare CustomValidator con ValidationSummary message box

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

e sul lato server:

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

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

risposta

10

Provare a utilizzare una proprietà ValidationGroup su tutti i validatori e sul ValidationSummary.

EDIT: "!" Codice Un'altra possibilità potrebbe essere la convalida del server

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

se sta tornando falso, è renderlo vero e quindi renderlo valido. Penso che dovresti sbarazzarti del "!" come segue:

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

UPDATE: Affinché il ValidationSummary per visualizzare il messaggio di convalida personalizzata in una messagebox, è necessario disporre di ClientValidationFunction Codice. Se è necessario visualizzare solo il riepilogo senza 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 
    } 

PIÙ: Se non si vuole fare lato client di convalida, provate questo trucco per mostrare l'avviso. Apportare questa modifica al tuo metodo ServerValidate CustomValidator:

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

Sono abbastanza sicuro che non è dove il problema è. Comunque, ci proverò e riferirò. –

+0

Ho aggiornato il mio post dopo aver fatto un'osservazione. Per favore conferma –

+0

Il codice che hai evidenziato è effettivamente ok. La validazione fallisce se l'utente è già registrato. Quella parte funziona. Quello che succede è che il '*' appare accanto alla casella di testo, ma ValidationSummary non esegue il rendering di una messagebox. –

1

si dovrebbe scrivere una proprietà

ValidationGroup="ValidationSummary1"

ad ogni validatore nel tuo caso.

Controllare anche se la pagina ha

AutoEventWireup="true" 
+0

CustomValidator in realtà convalida ed esegue il codice lato server. Quando non è valido, mostra il suo testo ("*") accanto alla casella di testo. Tuttavia, ValidationSummary mostra altri messaggi ma non da CustomValidator. –

+0

Basta provare queste due istruzioni, e dimmi. Perché ho assolutamente lo stesso caso, e il messaggio del validatore personalizzato compare nel validationsummary – DaDa

+0

Grazie per la risposta DaDa. Forse dovrei chiarire che ValidationSummary mostra l'errore da CustomValidator SE ho impostato ShowSummary = "true". Il problema è quando voglio mostrare una messagebox. –

7

L'opzione ShowMessageBox è completamente sul lato client, in modo che valuterà solo se è stata impostata la ClientValidationFunction sul CustomValidator.

È anche possibile simularlo registrando uno script che fa un avviso, quindi quando si torna dalla convalida del server, verrà richiesto con il messaggio di errore. Questo può essere registrata nel metodo ServerValidate (per @Jose Basilio), oppure è possibile chiamare il seguente metodo durante l'evento PreRender per registrare un pop-up 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); 
      } 
     } 
    } 
+0

Grazie MOLTO! Funziona come un fascino! –

+0

l'unico problema è al momento, non sono autorizzato a rendering js personalizzati. –

1

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

Recentemente ho avuto lo stesso problema. ValidationSummary non mostrava ErrorMessage da CustomValidator quando ServerValidate ha dichiarato un errore di convalida.Dato che per impostazione predefinita (come mostrato dal mio piccolo reverse engineering) il riepilogo di convalida viene visualizzato lato client sul postback, ho semplicemente aggiunto uno script che controlla tutti i validatori sul caricamento del documento/completamento del postback asincrono e attiva la creazione del riepilogo di convalida per i 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 annidati con validatori, pannello di aggiornamento e riepilogo di convalida nella pagina padre.

More details here.

1

ho trovato una soluzione per quando JavaScript è disabilitato e il ValidationSummary non mostra la proprietà errorMessage del CustomValidator. Questo è necessario poiché l'inserimento di script o avvisi, come descritto sopra, non funzionerà.

Aggiungere un nuovo controllo Validatore, chiamiamolo CustomValidatorProxy, impostare la proprietà ControlToValidate su uno qualsiasi dei controlli del modulo e EnableClientScript=false.

All'interno del gestore ServerValidate eventi eseguire la convalida personalizzata e se convalida non riesce impostare la proprietà IsValid del CustomValidator e CustomValidatorProxy a false e allo stesso modo impostare sia ErrorMessage proprietà.

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

disponibile The CustomValidatorProxy è prima della CustomValidator nel ValidatorCollection della pagina, allora il gestore ServerValidate sostituirà il valore IsValid proprietà che il CustomValidatorProxy sarebbe tornato dopo aver convalidato il valore ControlToValidate e la vostra ErrorMessage dal CustomValidator verrà visualizzato nella ValidationSummary .

+2

Quello che stai facendo sarebbe più leggibile se il codice fosse mostrato –

1

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