2012-06-16 12 views
9

Arbeits Ich habe das folgende Stück asp:CustomValidator nicht gut

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

Und dann die Funktion:

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

Problem ist, dass, obwohl die Custom Validator-Funktion aufgerufen wird und setzt .IsValid auf false, die Tastenlogik noch läuft!

+0

Ich bin nicht sicher, ob es etwas wert ist, aber ich habe auch versucht, NoUserValidator.IsValid = false – RanH

+0

Ich sehe nicht, den Button in Ihrem Markup zu setzen, aber stellen Sie sicher, dass es seine Validation auf Ihre RegisterUserValidationGroup gesetzt hat. – Gloopy

+0

Ich fügte den Knopfcode dem msg hinzu – RanH

Antwort

11

In Ihrer Onclick-Funktion für die Schaltfläche hinzufügen, einen Scheck, um zu sehen, ob die Seite

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

gültig ist, dass es tun soll. Dies liegt daran, dass Ihr benutzerdefinierter Validator so konfiguriert ist, dass er während des Postbacks auf dem Server überprüft wird. Was passiert, ist, dass der Code zuerst den Validator-Code UserValidate ausführt, in dem Sie das Flag IsValid setzen. Weiter im Postback-Stack ist die Onclick-Funktion der Schaltfläche. Diese Funktion wird unabhängig vom Ergebnis der Validiererfunktion ausgeführt, daher müssen Sie hier den Wert des Flags IsValid überprüfen. Dies ist das Verhalten beim Überprüfen des benutzerdefinierten Validierungssteuerelements auf der Serverseite.

Eine Alternative ist die Validierung auf der Client-Seite. Wenn Sie sich den von Ihrem Browser erzeugten Seitenquellcode ansehen, werden Sie sehen, dass Javascript für die RegularExpressionValidator hinzugefügt wird. Sein Verhalten ist bekannt und wird auf der Client-Seite gehandhabt, so dass kein Postback erforderlich ist, um den Ausdruck auszuwerten und die Seite zu validieren (alles wird von Javascript gehandhabt). Die benutzerdefinierte Validiererfunktion ist nicht bekannt, daher ist ein Postback erforderlich, sofern Sie nicht selbst ein clientseitiges Validierungsskript definieren.

Hier ist ein Link zu mehr Informationen auf MSDN.

+1

Dank es reparierte es, können Sie erklären, warum es gut mit den anderen validators funktioniert, und für den kundenspezifischen musste ich hinzufügen, was Sie schrieben? – RanH

+1

Eigentlich bin ich mir nicht sicher, also werde ich nur raten, aber ich denke es liegt daran, dass die anderen Validatoren auf der Client-Seite validieren, während der benutzerdefinierte Validator die Serverseite validiert. Da es serverseitig ist, hat das Postback bereits begonnen, und Sie führen zunächst Ihren benutzerdefinierten Validator und dann die Klickfunktion der Schaltfläche aus. Ist das sinnvoll? –

+0

Die Art, wie Sie es beschreiben, macht Sinn, aber ich würde erwarten, dass die Seite auf alle Validatoren wartet, bevor Sie fortfahren, und außerdem sind alle anderen auch auf runat = server konfiguriert, aber vielleicht ist das egal? – RanH