2012-04-16 6 views
8

Ho inserito uno CustomValidator nel mio modulo. Non ho impostato la proprietà ControlToValidate. Nel suo evento ServerValidate ho scritto il seguente:CustomValidator ServerValidate il metodo non viene attivato

protected void CustomValidator1_ServerValidate(object source,  
               ServerValidateEventArgs args) 
{ 
    args.IsValid = false; 
} 

ho messo un punto di interruzione a questo metodo, ma sembra non arrivare mai a quel punto. Ma se lo faccio su un altro modulo funziona come un fascino.

  1. La ValidationGroup struttura sia del pulsante e la CustomValidator sono uguali
  2. Ho provato a cancellare questa struttura sia il pulsante e il CustomValidator, ancora non funziona.

Sembra che ci sia qualcosa in tutto il formato. Ho appena inserito un modulo CustomValidator e non tocchi nessuna delle sue proprietà se non impostando il suo metodo evento ServerValidate.

EDIT: Ecco la parte aspx:

<asp:CustomValidator ID="CustomValidator2" runat="server" 
     ErrorMessage="This is a test" 
    onservervalidate="CustomValidator1_ServerValidate" 
    ValidationGroup="PA"></asp:CustomValidator> 


<asp:Button ID="btnPensionersOK" runat="server" Text="OK" Width="75px" 
      onclick="Button1_Click" ValidationGroup="PA" /> 

risposta

19

cercare di forzare la convalida del gestore di pulsante del mouse tramite Page.Validate:

protected void Button1_Click(Object sender, EventArgs e) 
{ 
    Page.Validate(); 
    if(Page.IsValid) 
    { 
     // servervalidate should have been called 
    } 
} 

Edit (dai commenti):

Se si desidera validare il customvalidator se non è stato inserito/selezionato nulla nei controlli, è necessario impostare ValidateEmptyText su true. Si potrebbe anche voler lasciare che lo CustomValidator sostituisca lo RequiredFieldValidators.

Suppongo che l'ordine del validatore su aspx decida se viene chiamato o meno il severvalidate di un validatore personalizzato se un precedente Validatore ha già effettuato Page.IsValid=false. Oppure ASP.NET è così intelligente da supporre che lo SeverValidate sia più costoso di un semplice controllo text-is-empty.

+0

Ma come mai funzionano altri validatori? Ho diversi RequiredFieldValidator sullo stesso modulo ma funzionano normalmente. E ancora, faccio esattamente la stessa cosa su un'altra forma, e non c'è problema, convalida. Il problema è che il metodo ServerValidate non viene attivato. –

+1

@ MikeJM: non lo so. Stai collegando i dati nel page_load sui postback? Stai chiamando da qualche altra parte 'Page.Validate()'? Hai degli errori javascript? I RequiredFieldValidators impediscono il postback? Si sta postando affatto? –

+0

Sì, sto collegando i dati in page_load ma non su PostBack. Non chiamo mai Page.validate() da nessun'altra parte. Non ho errori javascript. I RequiredFieldValidators impediscono il postback. Sta postando indietro. –

0

Vorrei anche aggiungere altro aiuto per coloro che useranno CustomValidators e RequiredFieldValidators contemporaneamente. Si dovrebbe tener conto che la convalida del lato client ha luogo prima. E la convalida sul lato server avverrà solo dopo PostBack. Sono sicuro che ce l'hai, ma nel caso questo non sia abbastanza chiaro: significa che prima tutti i controlli che sono vincolati a certi validatori di lavoro lato client devono essere validi per consentire a Postback di verificarsi. Dopo Pagina. IsValid è true Le cose sul lato server vengono eseguite e inviano eventuali modifiche che includono i messaggi di convalida sul lato server.

Così qui sono i modi si possono fare entrambe le CustomVCalidators e altri costruiti in validatori di lavorare allo stesso tempo .:

  1. Impostare entrambi i gruppi di validatori di lavorare sul lato client. In questo caso dobbiamo assicurarci che per i valitor personalizzati sia possibile individuare lo script che effettuerà la convalida sul lato client. Senza scrivere script e semplicemente compilando il metodo ServerValidate la convalida avverrà nel server. Anche se la proprietà EnableClientScript è impostata su True.

  2. Impostare entrambi i gruppi di validatori sul lato server. Per fare ciò basta impostare EnableClientScript su False. Ma nota che questo caricherà il server.