Custom Validator Fecha: 04/Ene/2005 (2 de Enero del 2004)
|
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,6C�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 FalloUna 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� ValidaSecuenciaErrorMessage = "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 VBPrivate 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 SubDe 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.
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