2012-06-16 11 views
9

Ho il seguente pezzo di asp:CustomValidator non funziona bene

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
     ValidationGroup="RegisterUserValidationGroup"/> 

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label> 
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox> 
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
     ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server" 
     CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup"> 
    *</asp:RegularExpressionValidator> 
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
     ValidationGroup="RegisterUserValidationGroup" OnServerValidate="UserValidate">*</asp:CustomValidator> 

E allora la funzione:

protected void UserValidate(object source, ServerValidateEventArgs args) 
    { 
     SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'"; 
     DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty); 
     if (dv.Table.Rows.Count != 0) 
      args.IsValid = false; 
     else 
      args.IsValid = true; 
    } 

Button:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
     ValidationGroup="RegisterUserValidationGroup" 
     onclick="CreateUserButton_Click"/> 

Il problema è che anche se viene chiamata la funzione di convalida personalizzata e imposta .IsValid su falso, la logica del pulsante è ancora in esecuzione!

+0

non sono sicuro se vale la pena nulla, ma ho anche provato a impostare NoUserValidator.IsValid = false – RanH

+0

non vedo il pulsante nel vostro markup ma assicurarsi che ha il suo ValidationGroup impostato sulla RegisterUserValidationGroup. – Gloopy

+0

Ho aggiunto il codice del pulsante al messaggio – RanH

risposta

11

Nella funzione onclick per il pulsante, aggiungere un controllo per vedere se la pagina è valida

protected void CreateUserButton_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     // Create the user 
    } 
} 

Che dovrebbe farlo. Questo perché il tuo validatore personalizzato è configurato per la convalida sul server, durante il postback. Quello che succede è che il codice prima esegue il codice di convalida UserValidate, dove si imposta il flag IsValid. Il prossimo nello stack postback è la funzione onclick del pulsante. Questa funzione verrà eseguita indipendentemente dal risultato nella funzione di convalida, quindi è qui che è necessario verificare il valore del flag IsValid. Questo è il comportamento quando si convalida il controllo di convalida personalizzato sul lato server.

Un'alternativa è quella di convalidare dal lato client. Se guardi il codice sorgente della pagina generato dal tuo browser, vedrai che Javascript è stato aggiunto per lo RegularExpressionValidator. Il suo comportamento è noto e gestito dal lato client, quindi non è richiesto alcun postback per valutare l'espressione e convalidare la pagina (è gestita da javascript). La funzione di convalida personalizzata non è nota, quindi è necessario un postback a meno che tu non definisca autonomamente uno script di convalida sul lato client.

Ecco un collegamento a ulteriori informazioni su MSDN.

+1

Grazie, l'ho risolto, puoi spiegare perché funziona bene con gli altri validatori, e per quello personalizzato ho dovuto aggiungere quello che hai scritto? – RanH

+1

In realtà, non ne sono sicuro, quindi ho intenzione di indovinare, ma penso che sia perché gli altri validatori stanno convalidando sul lato client, mentre il validatore personalizzato sta convalidando il lato server. Dal momento che è lato server, il postback è già iniziato, e tu stai prima eseguendo il tuo validatore personalizzato, quindi la funzione clic del pulsante. Ha senso? –

+0

Il modo in cui lo descrivi ha senso, ma mi aspetto che la pagina attenda l'approvazione di tutti i validatori prima di continuare, e inoltre tutti gli altri sono configurati anche su runat = server, ma forse non ha importanza su di essi? – RanH