Custom Validator
Utilizar un Custom Validator

Fecha: 04/Ene/2005 (2 de Enero del 2004)
Autor: Misael Monterroca mmonterroca@neo-mx.com

 


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