2012-04-16 14 views
8

Puse un CustomValidator en mi formulario. No he configurado su propiedad ControlToValidate. En su caso ServerValidate He escrito lo siguiente:El método CustomValidator ServerValidate no se activa

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

puse un punto de interrupción a este método, pero parece que nunca llegue a ese punto. Pero si hago esto en otra forma, funciona como un encanto.

  1. El ValidationGroup propiedad tanto del botón y el CustomValidator son los mismos
  2. traté de eliminar esta propiedad tanto en el botón y el CustomValidator, todavía no funciona.

Parece que hay algo en todo el formulario. Acabo de poner un CustomValidator en el formulario y no toco ninguna de sus propiedades más que simplemente establecer su método de evento ServerValidate.

EDIT: Aquí está 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" /> 

Respuesta

19

tratar de forzar la validación en el controlador de botones de clic a través de Page.Validate:

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

Editar (de comentarios):

Si desea que elvalidador personalizado valide si no se ingresó/seleccionó nada en sus controles, debe configurar ValidateEmptyText a verdadero. También es posible que desee dejar que el CustomValidator reemplace el RequiredFieldValidators.

Supongo que el orden de validador en el aspx decide si se llama o no un valor de severvalidador personalizado si un Validator anterior ya ha realizado Page.IsValid=false. O ASP.NET es tan inteligente que supone que el SeverValidate es más costoso que una simple comprobación de texto vacío.

+0

Pero, ¿cómo funcionan otros validadores? Tengo varios RequiredFieldValidator en el mismo formulario pero funcionan normalmente. Y nuevamente, hago exactamente lo mismo en otra forma, y ​​no hay problema, valida. Las cosas en las que el método ServerValidate no se activa. –

+1

@MikeJM: No lo sé. ¿Estás enlazando datos en page_load en las devoluciones? ¿Estás llamando a otra parte 'Page.Validate()'? ¿Recibes algún error de javascript? ¿Los RequiredFieldValidators previenen la devolución de datos? ¿Se está publicando de nuevo? –

+0

Sí, estoy enlazando datos en page_load pero no en PostBack. Nunca llamo a Page.validate() en ningún otro lado. No obtengo ningún error de javascript. RequiredFieldValidators impide la devolución de datos. Está publicando de vuelta. –

0

También me gustaría ayudar un poco más a aquellos que usarán CustomValidators y RequiredFieldValidators al mismo tiempo. Se debe tener en cuenta que la validación del lado del cliente se lleva a cabo primero. Y la validación del lado del servidor ocurrirá solo después de PostBack. Estoy seguro de que lo obtuvo, pero en caso de que esto no esté del todo claro: significa que primero todos los controles que están vinculados a ciertos validadores de trabajo del lado del cliente deben ser válidos para permitir que se produzca la devolución de datos. Después de Page. IsValid es True. Las cosas del lado del servidor tienen lugar y publica cualquier cambio que incluya mensajes de validación del lado del servidor.

Así que aquí están las maneras que uno puede hacer ambas CustomVCalidators y otros construidos en los validadores para trabajar al mismo tiempo .:

  1. Ajuste ambos grupos de validadores para trabajar en el lado del cliente. En este caso, debemos asegurarnos de que para el (los) validad (es) personalizado (s) espaciamos el script que hará la validación en el lado del cliente. Sin escribir un script y simplemente completando el método ServerValidate, la validación tendrá lugar en el servidor. Incluso si la propiedad EnableClientScript está establecida en True.

  2. Establezca ambos grupos de validadores para trabajar en el lado del servidor. Para hacerlo, simplemente configure EnableClientScript en False. Pero tenga en cuenta que esto cargará el servidor.

Cuestiones relacionadas