2012-06-16 24 views
9

tengo el siguiente fragmento de asp:CustomValidator no funciona bien

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

Y entonces la función:

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

Botón:

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

El problema es que, aunque se llama a la función de validador personalizada y establece .IsValid en falso, ¡la lógica del botón aún se ejecuta!

+0

No estoy seguro de si vale la pena algo, pero también traté de establecer NoUserValidator.IsValid = false – RanH

+0

No veo el botón en su marcado, pero asegúrese de que tenga su ValidationGroup configurado en RegisterUserValidationGroup. – Gloopy

+0

Agregué el código del botón al msg – RanH

Respuesta

11

En su función onclick del botón, añadir una comprobación para ver si la página es válida

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

Eso debería hacerlo. Esto se debe a que su validador personalizado está configurado para validar en el servidor, durante la devolución de datos. Lo que sucede es que el código primero ejecuta el código del validador UserValidate, donde establece el indicador IsValid. El siguiente en la pila de postback es la función onclick del botón. Esta función se ejecutará independientemente del resultado en la función del validador, por lo que aquí es donde debe verificar el valor de la bandera IsValid. Este es el comportamiento cuando valida el control de validación personalizado en el lado del servidor.

Una alternativa es validar en el lado del cliente. Si observa el código fuente de la página generado por su navegador, verá que se agrega Javascript para el RegularExpressionValidator. Su comportamiento es conocido y se maneja en el lado del cliente, por lo que no se requiere publicar de nuevo para evaluar la expresión y validar la página (todo es manejado por javascript). La función del validador personalizado no se conoce, por lo que se requiere una devolución de datos a menos que usted mismo defina un script de validación del lado del cliente.

Aquí hay un enlace para obtener más información sobre MSDN.

+1

Gracias, lo arreglé, ¿puedes explicar por qué funciona bien con los otros validadores, y para el personalizado tuve que agregar lo que escribiste? – RanH

+1

En realidad, no estoy seguro, así que lo voy a adivinar, pero creo que es porque los otros validadores están validando en el lado del cliente, mientras que el validador personalizado está validando el lado del servidor. Dado que es del lado del servidor, la devolución de datos ya ha comenzado, y primero está ejecutando su validador personalizado, luego la función de clic del botón. ¿Tiene sentido? –

+0

La forma en que la describe tiene sentido, pero espero que la página espere la aprobación de todos los validadores antes de continuar, y además todos los demás también están configurados para runat = server, ¿pero quizás eso no les importe? – RanH

Cuestiones relacionadas