Custom Validator
Utilizar un Custom Validator

Fecha: 04/Ene/2005 (2 de Enero del 2004)
Autor: Misael Monterroca [email protected]

 


Los controles para validaci�n que incluye .Net normalmente cubren la mayor parte de las necesidades comunes de validaci�n, sin embargo en ocasiones necesitamos realizar alguna validaci�n personalizada con lo cual los controles existentes (RequiredFieldValidator,CompareValidator,RangeValidator,RegularExpresionValidator) no podr�amos lograr.

La funci�n del control CustomValidator es precisamente esa, el brindarnos un mecanismo r�pido para crear un validador personalizado sin tener que crear por ejemplo un control de usuario personalizado, aunque al utilizar un CustomValidator estar�amos desaprovechando la funcionalidad de reutilizar nuestro c�digo ya que toda la funcionalidad quedar� dentro de la pagina que contendr� nuestro validador, pero al final de cuentas estamos hablando de un caso excepcional, aunque si lo que buscas es reutilizar tu validaci�n personalizada entonces lo mejor seria precisamente crear un control de usuario heredando de la clase base BaseValidator, la cual provee todo el esquema base para poder crear un validador personalizado desde cero, un ejemplo de como hacer esto lo puedes encontrar Aqu� en  un articulo de Eugenio Serrano:

Las validaciones que contempla el CustomValidator son dos:

Cliente
Esta validaci�n es a trav�s de c�digo scripting (javascript, vbscript) y normalmente es utilizada para evitar realizar viajes al servidor de manera innecesaria, ya que el poder identificar los errores directamente en el cliente nos permite advertir de la existencia de estos sin la necesidad de esperar a que el servidor realice dichas validaciones.

Servidor
Est� validaci�n es como su nombre lo describe es realizada en el servidor (Asp.Net) dicha validaci�n es imprescindible ya que puede darse el caso de que el cliente, por ejemplo, tenga deshabilitada la ejecuci�n de script del lado del cliente y con esto la validaci�n del lado del cliente no seria ejecutada, por est� y algunas otras razones no es factible utilizar �nicamente la validaci�n del lado del cliente ya que podr�amos considerar informaci�n no correcta si omitimos este paso.

 

Utilizando el Control

Cre� una nueva soluci�n o agregue una pagina en una soluci�n existente y en el ToolBox localice el control CustomValidator y agregue en una nueva pagina.

 

 

Localice de igual manera en el ToolBox el control TextBox y agregue 5 controles a su pagina, realice lo mismo y agregue un control del tipo Button. Haciendo lo anterior quedara una estructura similar a �sta imagen.

 

 

Validaci�n Cliente

Una vez definido nuestro esquema inicial, el siguiente paso ser� escribir la funci�n de validaci�n del lado del cliente para lo cual ser� necesario cambiar a la vista de HTML.

La funci�n de validaci�n puede estar en cualquier lenguaje scripting (VbScript, JavaScript, JSScript) para este ejemplo el lenguaje ser� JavaScript, pero sea cual sea el lenguaje seleccionado la funci�n que realizara la validaci�n debe contener la siguiente estructura.

FuncionQueValida(source, arguments) , en donde el par�metro source representa el objeto que origino la validaci�n, arguments contiene la funcionalidad mediante la cual indicaremos el estado de la validaci�n (Valida o No Valida)

La funci�n que crearemos tendr� como finalidad asegurarse que introduzcan una secuencia valida de n�meros incremental en 2 posiciones.

Secuencia Valida : 1,3,5,7,9
Secuencia No Valida : 1,3,4,5,6

C�digo Script.

 

function ValidaSecuencia(source, arguments)
{            
    //Obtiene valor inicial                
    var Valor = document.all.TextBox1.value;
    //Comprobaci�n de valor numerico
    if (isNaN(parseInt(Valor))){
        arguments.IsValid=false;
        return;
    }                

    Valor = parseInt(Valor);    //Se hace el cast a int ya que proviene de un string                
    var incn;
    //Bucle para comparar los valores introducidos en las cajas de texto
    for (incn = 2;incn < 6;incn++){
        Valor += 2;    //Se incremente el valor en dos posiciones                    
        textbox = eval("document.all.TextBox" + incn);    //Se obtiene el objeto de texto
        if (textbox.value != Valor){//Se realiza la comparaci�n del valor esperado
            arguments.IsValid=false;
            return;    
        }
    }                
    arguments.IsValid=true;    //Si llego hasta aqui entonces la validaci�n fue exitosa
}

 

Como coment�bamos, a trav�s del par�metroarguments indicamos el estado de la validaci�n, para informar del estado lo hacemos utilizando el miembro IsValid

arguments.IsValid = true Validaci�n Exitosa
arguments.IsValid = false Validaci�n Fallo

Una vez que tenemos nuestra funci�n c�dificada configuraremos nuestro CustomValidator para indicarle cual ser� la funci�n que debe  tomar para hacer las validaciones del lado del cliente, as� como el mensaje de error que mostrara. El control CustomValidator contiene la propiedad ControlTovalidate, mediante la cual podemos indicarle cual ser� el control al que realizara la validaci�n, la asignaci�n a �sta propiedad es opcional ya que no siempre la validaci�n es a un control en particular, tal es el caso de la validaci�n que estamos realizando a manera de ejemplo, en donde la validaci�n esta contemplando a 5 controles del tipo TexBox.

Propiedades a utilizar

ClientValidationFunction = ValidaSecuencia
Especifica que la funci�n que realizara la validaci�n del lado del cliente ser� ValidaSecuencia

ErrorMessage = "La secuencia no es valida, introduzca un valor como 1,3,5,7,9"
Establece la descripci�n del error en dado caso de que la validaci�n no sea exitosa.

 

Comprobaci�n de Validaciones del Cliente

Para comprobar que la validaci�n esta corriendo de manera correcta, agregaremos un mensaje en el evento clic de nuestro bot�n, cuando la informaci�n capturada sea correcta y el bot�n sea precionado entonces se mostrara el mensaje "Numeros Validos" , en caso contrario se mostrara el mensaje de error que establecimos en el CustomValidator

Agregre al bot�n Button1 en su evento click la siguiente sentencia.

C�digo C#

private void Button1_Click(object sender, System.EventArgs e)
{
    Response.Write("Numeros Validos");
}

C�digo Vb

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Response.Write("Numeros Validos")
End Sub

 

Al presionar el bot�n despues de haber introducido una secuencia de numeros incorrecta, el CustomValidator informara de la existencia de un error y la pagina no viajara al servidor.

Cuando la informaci�n es corregida entonces la petici�n si viajara al servidor y se mostrara el mensaje de "Numeros Validos", sin embargo, como comentabamos inicialmente si el cliente deshabilitara la opci�n de scripting, la informaci�n viajar� al servidor a�n cuando la informaci�n sea incorrecta.

 

 

 

A�n cuando se debio generar un error debido a que la informaci�n escrita fue incorrecta, esto no sucedio debido a que falta codificar la validaci�n del lado del servidor, con lo cual evitaremos que sucedan este tipo de situaciones.

 

Validaci�n Servidor

La validaci�n en el servidor debe contener la misma funcionalidad que contemplamos dentro de la validaci�n del lado del cliente, la diferencia por supuesto, ser� que �sta ya no ser� en c�digo script, dicha validaci�n la realizaremos dependiendo del lenguaje en el que estemos desarrollando nuestra aplicaci�n.

Lo que haremos ser� escribir c�digo para el evento ServerValidate de nuestro control CustomValidator1, la estructura de la funci�n es similar a la descrita para la funci�n cliente, recibe dos parametros sender y args.

C�digo en C#

private void CustomValidator1_ServerValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
{
   
   
    //Obtiene valor inicial                                              
    

   
   
   
    int Valor = -1;

   

   

    try
   
    {
       
       
        //Intenta hacer la conversi�n a int para comprobar que sera un valor numerico
        Valor = Int32.Parse(TextBox1.Text);
    }
   
   
    catch
    {
        args.IsValid = false;
       
       
        return;
    }                       


                          


                           


    //Bucle para comparar los valores introducidos en las cajas de texto
   
   
    for (int incn = 2;incn < 6;incn++)
    {
        Valor += 2;          //Se incremente el valor en dos posiciones                                                          
        

       
        TextBox objTxt = (TextBox)Page.FindControl("TextBox" + Convert.ToString(incn));          //Se obtiene el objeto de texto
       
       
        try
       
        {
           
           
            if (Convert.ToInt32(objTxt.Text) != Valor)
            {//Se realiza la comparaci�n del valor esperado
               
                args.IsValid=false;
               
               
                return;   
            }
        }
       
       
        catch
       
        {
           
           
            //No es un valor numerico
            args.IsValid = false;
           
           
            return;
        }
    }               
    args.IsValid=true;          //Si llego hasta aqui entonces la validaci�n fue exitosa
}
C�digo en VB
Private Sub CustomValidator1_ServerValidate(ByVal source As System.Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
   
   
    'Obtiene valor inicial                                              
    

   
   
   
    Dim Valor As Integer = -1

   

   

    Try
       
       
        'Intenta hacer la conversi�n a int para comprobar que sera un valor numerico
        Valor = Int32.Parse(TextBox1.Text)
   
   
    Catch
        args.IsValid = False
       
       
        Exit Sub
   
   
    End Try


   


   


    'Bucle para comparar los valores introducidos en las cajas de texto
   
   
    For incn As Integer = 2 To 5
        Valor += 2 'Se incremente el valor en dos posiciones                                                          
        

       
       
       
        Dim objTxt As TextBox = Page.FindControl("TextBox" + Convert.ToString(incn)) 'Se obtiene el objeto de texto
       
       
        Try
           
           
            If (CType(objTxt.Text, Int32) <> Valor) Then
               
               
                'Se realiza la comparaci�n del valor esperado
                args.IsValid = False
               
               
                Exit Sub
           
           
            End If
       
       
        Catch
           
           
            'No es un valor numerico
            args.IsValid = False
           
           
            Exit Sub
       
       
        End Try
   
   
    Next

    args.IsValid = True 'Si llego hasta aqui entonces la validaci�n fue exitosa

End Sub

De igual manera que en la funci�n script del cliente, estamos utilizando el parametro args para indicar si la validacion fue o no exitosa, al realizar esto, la validaci�n ya se estara realizando tambien en el servidor. Se realizamos nuevamente la prueba de deshabilitar el scripting en el cliente veremos que el servidor ya est� realizando la validaci�n correspondiente, con lo cual el mensaje de error ahora si es mostrado.

A�n cuando la validaci�n ya se esta ejecutando en el servidor como lo demuestra la imagen anterior, a�n tenemos un problema, el evento del clic del bot�n fue ejecutado, con lo cual el mensaje de "Numeros Validos" se ha mostrado, esto es debido a que falta realizar una ultima modificaci�n a nuestro c�digo y esto es realizar la comprobaci�n de que la pagina tenga un estatus "valido", al cambiar el parametro args a args.IsValid = false le estamos indicando a nuestra p�gina que no es "valida", con lo cual  tendremos que realizar est� comprobaci�n para que �nicamente se muestre el mensaje si es que la pagina tiene un estado valido, es decir cuando la sentencia de validaci�n establecio su parametro args como args.IsValid = true.

La propiedad para realizar �sta comprobaci�n se encuentra dentro de la clase Page y se llama Valid, cuando Page.Valid es "true" se da por hecho que se realizaron todas las validaciones correspondientes y est�s fueron validas, en caso que la propiedad nos regrese "false" nos est� indicando que alguna validaci�n fue incorrecta, por lo cual no se deberia de realizar el procesamiento correspondiente

C�digo en C#

private void Button1_Click(object sender, System.EventArgs e)
{
   
   
   
    if (Page.IsValid)
    {
        Response.Write("Numeros Validos");
    }
}

C�digo en VB

 

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   
   
   
    If (Page.IsValid) Then
       
        Response.Write("Numeros Validos")
   
   
   
    End If
End Sub

 

Con el c�digo anterior el mensaje "Numeros Validos" ser� mostrado �nicamente cuando la validaci�n sea correcta.


ir al índice

Fichero con el c�digo de ejemplo CSharp: neo-mx_CustomValidatorCSharp.zip - 12.9 KB

Fichero con el c�digo de ejemplo Vb: neo-mx_CustomValidatorVb.zip - 12.9 KB