Colaboraciones en el Guille

Controles de Validación en ASP .Net

Fecha: 30/Dic/2005 (29 de Diciembre de 2005)
Autor: Ing. Fernando Luque Sánchez

fls2307@hotmail.com



Sres. Desarrolladores, se que me extrañaron mucho, pero estuve y aun estoy algo ocupado con unos proyectos pero definitivamente la fuerza y las ganas por colaborar con sus conocimientos es mayor. Sin mas preámbulos vamos con lo nuestro.(párrafo repetido de mi artículo anterior...je,je,je)

Validación de Datos

La validación de datos garantiza la corrección y precisión de todos los valores de datos de la aplicación. La validación de datos de la aplicación puede diseñarse utilizando distintos enfoques: código de interfaz de usuario, código de aplicación o restricciones de bases de datos.

Hay varios tipos de validación de datos:

Una de las formas más sencillas de validación de datos consiste en comprobar el tipo de datos. La validación del tipo de datos responde a preguntas tan simples como "¿Es alfabética la cadena?" y "¿Es numérico el número?". Normalmente, validaciones tan simples se pueden controlar con la interfaz de usuario de la aplicación.

Como ampliación del tipo sencillo de validación, la comprobación del intervalo garantiza que el valor proporcionado esté entre los valores máximo y mínimo permitidos. Por ejemplo, un código de servicio con tipo de datos "character" sólo puede admitir caracteres alfabéticos de la A a la Z; el resto de caracteres no sería válido. Al igual que ocurre en el caso de la validación del tipo de datos, la interfaz de la aplicación puede proporcionar normalmente la validación de intervalo necesaria aunque, como alternativa de diseño, se puede crear una regla de empresa para controlar validaciones de intervalo.

La comprobación del código es un poco más complicada y requiere normalmente una tabla de búsqueda. Por ejemplo, supongamos que la aplicación calcula los impuestos sobre ventas correspondientes únicamente a determinados códigos de estados. Será necesario crear una tabla de validación que contenga códigos de estados sujetos a impuestos que estén autorizados. Esta tabla de validación puede formar parte de una regla de empresa, o se puede implementar directamente en la base de datos a efectos de búsqueda mediante consulta.

A veces, una validación sencilla de búsqueda y de campo no es suficiente. Por ejemplo, consideremos el caso de una petición de asistencia sanitaria que tiene un importe facturado de 123,57 dólares, pero cuyo importe permitido puede depender de una acumulación variable anual con un límite de 1.500 dólares (sin superar directiva de duración máxima de 100.000 dólares). En esta situación, la validación de datos va más allá de la pantalla de entrada de datos inmediata y consiste también en una evaluación minuciosa de cómo se ha de pagar la petición basándose en los límites de la directiva y en las acumulaciones anual y de vida. Este tipo de validación de datos compleja de varios archivos se suele controlar mejor con reglas de empresa basadas en procedimientos.

Las estructuras de archivos antiguas tienen el inconveniente de que los datos se corrompen con frecuencia (por ejemplo, campos numéricos en blanco o con caracteres alfabéticos). Cuando se crea una aplicación empresarial, se debe crear también una utilidad de comprobación para verificar la corrección de cada uno de los campos de todos los registros de los archivos que utiliza la aplicación. Si no se realiza esta acción, los resultados producidos por la aplicación pueden ser imprevisibles.

Controles de Validación en ASP .Net

Los controles de servidor de validación son un conjunto de controles que permiten validar un control de servidor de entrada asociado, como un control TextBox, y mostrar un mensaje personalizado cuando se produce un error en la validación. Cada control de validación realiza un tipo determinado de validación. Por ejemplo, se puede validar frente a un valor específico o un intervalo de valores mediante los controles CompareValidator y RangeValidator, respectivamente. Se puede incluso definir criterios de validación propios mediante el control CustomValidator. Dado que el mensaje de error se muestra en el control de validación, se puede controlar el lugar donde se muestra el mensaje en la página Web colocando el control de validación en el lugar deseado. También se puede mostrar un resumen de los resultados de todos los controles de validación en la página mediante el control ValidationSummary.

De manera predeterminada, la validación se realiza al hacer clic en un control de botón, como Button, ImageButton o LinkButton. Para impedir que se realice la validación al hacer clic en un control de botón, establezca la propiedad CausesValidation del control de botón en false. Esta propiedad suele estar establecida en false para un botón cancel o clear con el fin de impedir que se realice la validación cuando se hace clic en el botón.Las reglas de estilo CSS se aplican "en cascada", es decir, las reglas de estilo globales se seguirán aplicando a todos los elementos HTML a menos que sean sustituidas por las reglas de estilo locales. En general, las reglas de estilo locales tienen prioridad sobre las reglas de estilo globales. Esto significa que un estilo definido en un bloque STYLE de una página Web, por ejemplo, puede modificar desde una página concreta el estilo de todo el sitio Web definido en una hoja de estilos CSS externa. De forma similar, un estilo en línea definido dentro de una etiqueta HTML individual de la página puede modificar en una línea los estilos definidos para este tipo de elemento en todo el sitio.

Propiedades básicas de los controles de Validación

La siguiente tabla muestra las principales propiedades que se aplican a todos los controles de validación.

Propiedad Descripción
ControlToValidate Id. de programación del control de salida que evaluará el control de validación. Si no es un Id. legítimo, se iniciará una excepción.
Display Modo en que se muestra el control de validación especificado. Esta propiedad puede ser uno de los siguientes valores:

Ninguno — El control de validación jamás se muestra en línea. Utilice esta opción cuando desee mostrar el mensaje de error sólo en un control ValidationSummary

Estático — El control de validación muestra un mensaje de error si se produce un error en la validación. Se asigna un espacio en la página Web para el mensaje de error incluso si el control de entrada supera la validación. No cambia el diseño de la página cuando el control de validación muestra su mensaje de error. Como el diseño de página es estático, si hay varios controles de validación para el mismo control de entrada, éstos deberán ocupar distintas ubicaciones en la página.

Dinámico — El control de validación muestra un mensaje de error si se produce un error en la validación. El espacio para el mensaje de error se asigna dinámicamente en la página cuando se produce un error en la validación. De este modo, varios controles de validación pueden compartir la misma ubicación física en la página.

EnableClientScript Indica si está habilitada la validación en el cliente. Para deshabilitar la validación en el cliente en los exploradores que admitan esta función, establezca la propiedad EnableClientScript en false.
Enabled Indica si está habilitado el control de validación. Para impedir que el control de validación valide un control de entrada, establezca esta propiedad en false.
ErrorMessage Mensaje de error que se va a mostrar en el control ValidationSummary si se produce un error en la validación. Si no está establecida la propiedad Text del control de validación, también se muestra este texto en el control de validación cuando se produce un error en la validación. Se utiliza normalmente la propiedad ErrorMessage para proporcionar diferentes mensajes para el control de validación y el control ValidationSummary.
ForeColor Especifica el color en el que se va a mostrar el mensaje en línea cuando se produce un error en la validación.
IsValid Indica si el control de entrada especificado por la propiedad ControlToValidate se determina como válido.
Text Si esta establecida esta propiedad, se muestra este mensaje en el control de validación cuando se produce un error en la validación. Si no está establecida esta propiedad, el texto especificado en la propiedad ErrorMessage se muestra en el control.

Descripción de los controles de Validación

Los controles de Validación los encontramos en el cuadro de herramientas, la imagen siguiente muestra los controles encerrados marcados.

Estilos - Web Form Inicial

RequiredFieldValidator

Utilice el control RequiredFieldValidator para convertir un control de entrada en un campo obligatorio. El control de entrada no supera la validación si el valor que contiene no cambia con respecto al valor inicial cuando se realizó la validación. Esto impide que el usuario deje el control de entrada asociado sin modificar. De manera predeterminada, el valor inicial es una cadena vacía (""), que indica que se ha de especificar un valor en el control de entrada para que éste supere la validación.

Nota   Antes de realizar la validación se quitan los espacios adicionales situados al principio y al final del valor de entrada. De este modo, se evita que un espacio introducido en el control de entrada supere la validación.

A veces, se desea tener un valor inicial que no sea una cadena vacía. Esto resulta útil cuando hay un valor predeterminado para un control de entrada y se desea que el usuario seleccione otro valor. Por ejemplo, puede haber un control ListBox con una entrada seleccionada, de manera predeterminada, que contiene instrucciones para que el usuario seleccione un elemento de la lista. El usuario debe seleccionar un elemento del control, pero se desea que el usuario no seleccione el elemento que contiene las instrucciones. Para impedir que el usuario seleccione este elemento, especifique su valor como valor inicial. Si el usuario selecciona este elemento, RequiredFieldValidator mostrará su mensaje de error. Para especificar el valor inicial del control de entrada asociado, establezca la propiedad InitialValue.

Nota   La propiedad InitialValue no establece el valor predeterminado del control de entrada. La propiedad InitialValue no tiene que coincidir ni siquiera con el valor predeterminado del control de entrada. Indica simplemente el valor que el usuario no podrá especificar en el control de entrada. El control de entrada no superará la validación si contiene este valor al realizarse la validación.

Se pueden asociar varios controles de validación al mismo control de entrada. Se puede utilizar, por ejemplo, un control de validación RequiredFieldValidator para asegurar que se han escrito datos en un control y usar al mismo tiempo un control de validación RangeValidator para comprobar que estos datos están comprendidos en un intervalo especificado.

CompareValidator

El control CompareValidator permite comparar el valor especificado por el usuario en un control de entrada, como un control TextBox, con el valor especificado en otro control de entrada o con un valor constante. También se puede usar el control CompareValidator para determinar si el valor especificado en un control de entrada se puede convertir al tipo de datos especificado por la propiedad Type.

Especifique el control de entrada que desee validar estableciendo la propiedad ControlToValidate. Si desea comparar un control de entrada específico con otro control de entrada, establezca la propiedad ControlToCompare en el nombre del control que desee comparar.

En lugar de comparar el valor de un control de entrada con otro control de entrada, se puede comparar el valor de un control de entrada con un valor constante. Especifique el valor constante con el que desee comparar estableciendo la propiedad ValueToCompare.

La propiedad Operator permite especificar el tipo de comparación que se va a realizar, como mayor que, igual que, etc. Si se establece la propiedad Operator en ValidationCompareOperator.DataTypeCheck, el control CompareValidator omitirá las propiedades ControlToCompare y ValueToCompare e indicará simplemente si el valor especificado en el control de entrada puede convertirse al tipo de datos especificado por la propiedad Type.

Nota   Si el control de entrada está vacío, no se llamará a ninguna función de validación y la validación se realizará correctamente. Utilice un control RequiredFieldValidator para impedir que el usuario omita un control de entrada.

RangeValidator

El control RangeValidator permite comprobar si la entrada de un usuario se encuentra entre un límite inferior y un límite superior especificados. Se pueden comprobar los intervalos entre pares de números, caracteres alfabéticos y fechas. Los límites se expresan como constantes.

Utilice la propiedad ControlToValidate para especificar el control de entrada que se va a validar. Las propiedades MinimumValue y MaximumValue especifican los valores mínimo y máximo del intervalo válido, respectivamente.

La propiedad Type se utiliza para especificar el tipo de datos de los valores que se van a comparar. Los valores que se van a comparar se convierten a este tipo de datos antes de realizarse cualquier comparación.

Nota   Si el control de entrada está vacío, no se llamará a ninguna función de validación y la validación se realizará correctamente. Utilice un control RequiredFieldValidator para impedir que el usuario omita un control de entrada. De manera similar, si el valor del control de entrada no se puede convertir al tipo de datos especificado por la propiedad Type, la validación también se llevará a cabo correctamente. Se recomienda encarecidamente utilizar un control CompareValidator adicional, con su propiedad Operator establecida en ValidationCompareOperator.DataTypeCheck, con el fin de comprobar el tipo de datos del valor de entrada.

Nota   El control RangeValidator iniciará una excepción si el valor especificado por la propiedad MaximumValue o MinimumValue no se puede convertir al tipo de datos especificado por la propiedad Type.

RegularExpressionValidator

El control RegularExpressionValidator se utiliza para determinar si el valor de un control de entrada coincide con un modelo definido por una expresión regular. Este tipo de validación permite comprobar secuencias de caracteres previsibles, como las de los números de la seguridad social, las direcciones de correo electrónico, los números de teléfono y los códigos postales, entre otras.

Nota   Si el control de entrada está vacío, no se llamará a ninguna función de validación y la validación se realizará correctamente. Utilice un control RequiredFieldValidator para impedir que el usuario omita un control de entrada.

La validación se realiza tanto en el cliente como en el servidor, salvo en el caso de que el explorador no admita la validación en el cliente o ésta haya sido explícitamente deshabilitada (estableciendo la propiedad EnableClientScript en false).

Utilice la propiedad ValidationExpression para especificar la expresión regular utilizada para validar el control de entrada. La sintaxis de la validación mediante expresiones regulares presenta algunas diferencias en el cliente y en el servidor. En el cliente, se utiliza la sintaxis de expresiones regulares de JScript. En el servidor, se utiliza la sintaxis Regex. Dado que la sintaxis de las expresiones regulares de JScript es un subconjunto de la sintaxis Regex , se recomienda utilizar la primera para obtener los mismos resultados en el cliente y en el servidor.alidator

CustomValidator

El control CustomValidator permite crear un control de validación con lógica de validación personalizada. Por ejemplo, se puede crear un control de validación que compruebe si el valor especificado en un cuadro de texto es un número par.
Los controles de validación siempre realizan la comprobación de validación en el servidor. También tienen una implementación completa en el cliente que permite a los exploradores compatibles con DHTML (como Microsoft Internet Explorer 4.0 ó posterior) realizar la validación en el cliente.
La validación en el cliente mejora el proceso de validación ya que se comprueban los datos proporcionados por el usuario antes de enviarlos al servidor. De este modo se pueden detectar los errores en el cliente antes de enviar el formulario y se evita la acción de ida y vuelta de la información necesaria para la validación en el servidor. Para crear una función de validación en el servidor, proporcione un controlador del evento ServerValidate que realiza la validación.
Para obtener acceso a la cadena del control de entrada que se va a validar, utilice la propiedad Value del objeto ServerValidateEventArgs que se ha pasado al controlador de eventos como parámetro. A continuación, se almacena el resultado de la validación en la propiedad IsValid del objeto ServerValidateEventArgs.

Para crear una función de validación en el cliente, agregue primero la función de validación en el servidor que se ha descrito anteriormente. A continuación, agregue a la página .aspx la función de secuencia de comandos de validación en el cliente. Si utiliza VBScript, la función deberá tener la siguiente forma:

Sub ValidationFunctionName (source, arguments)

Si utiliza JScript, la función deberá tener la siguiente forma:

Function ValidationFunctionName (source, arguments)

Utilice la propiedad ClientValidationFunction para especificar el nombre de la función de secuencia de comandos de validación en el cliente que está asociada al control CustomValidator. Como la función de secuencia de comandos se ejecuta en el cliente, la función debe estar en un lenguaje que admita el explorador de destino, como VBScript o JScript.

Al igual que en el caso de la validación en el servidor, la propiedad Value del parámetro arguments permite obtener acceso al valor que se va a validar. Para devolver el resultado de la validación, establezca la propiedad IsValid del parámetro arguments.

PRECAUCIÓN Al crear una función de validación en el cliente, asegúrese de incluir asimismo la función de validación en el servidor. Si crea una función de validación en el cliente sin una función correspondiente en el servidor, código malicioso podrá omitir la validación. Se pueden asociar varios controles de validación a un control de entrada individual para validar diferentes criterios.

Por ejemplo, se pueden aplicar varios controles de validación a un control TextBox que permite al usuario especificar la cantidad de elementos que se han de agregar a un carrito de la compra. Se puede utilizar un control CustomValidator para asegurar que el valor especificado es menor que la cantidad del inventario y un control RequiredFieldValidator para asegurar que el usuario especifica un valor en el control TextBox.

Nota Si el control de entrada está vacío, no se llamará a ninguna función de validación y la validación se realizará correctamente. Utilice un control RequiredFieldValidator para impedir que el usuario omita un control de entrada. Se puede usar un control CustomValidator sin establecer la propiedad ControlToValidate. Esto se suele hacer cuando se validan varios controles de entrada o controles de entrada que no se pueden usar con controles de validación, como el control CheckBox. En este caso, la propiedad Value del parámetro arguments pasado al controlador de eventos para el evento ServerValidate y a la función de validación en el cliente, siempre contiene una cadena vacía (""). Sin embargo, se sigue llamando a estas funciones de validación en los casos en los que resulte apropiado para determinar la validez en el cliente y en el servidor.
Para obtener acceso al valor que se va a validar, es preciso hacer referencia mediante programación al control de entrada que se desea validar y, a continuación, recuperar el valor de la propiedad apropiada. Por ejemplo, para validar un control CheckBox en el servidor, no establezca la propiedad ControlToValidate del control de validación y utilice el siguiente código para el controlador del evento ServerValidate:

Sub ServerValidation (source As object, args As ServerValidateEventArgs)

args.IsValid = (CheckBox1.Checked = True)

End Sub

Mostrar el resumen de los errores cometidos
El control ValidationSummary permite resumir los mensajes de error de todos los controles de validación de una página Web en una sola ubicación. El resumen puede aparecer en forma de lista, lista con viñetas o un único párrafo, en función del valor de la propiedad DisplayMode. El mensaje de error que se muestra en el control ValidationSummary para cada control de validación en la página viene especificado por la propiedad ErrorMessage de cada control de validación. Si no está establecida la propiedad ErrorMessage del control de validación, no se mostrará ningún mensaje de error en el control ValidationSummary correspondiente a dicho control de validación. También se puede especificar un título personalizado en la sección de encabezado del control ValidationSummary estableciendo la propiedad HeaderText.

Para controlar si se muestra o se oculta el control ValidationSummary, establezca la propiedad ShowSummary. El resumen también se puede mostrar en un cuadro de mensaje estableciendo la propiedad ShowMessageBox en true.

Fuente: MSDN  Library

Nuestro Ejemplo

Controles de Validación

Definiciones:

Para nuestro ejemplo, las definiciones resultantes de los controles utilizados es como sigue:

Control a Validar Definición

Para txtNombre
RequiredFieldValidator

<asp:requiredfieldvalidator id="rfvNombre" runat="server" ToolTip="Ver error al final de la página" Display="Dynamic" ControlToValidate="txtNombre" ErrorMessage="Falta Ingreso de Nombre">*</asp:requiredfieldvalidator>

Para txtDire
RequiredFieldValidator
<asp:requiredfieldvalidator id="rfvDire" runat="server" Display="Dynamic" ControlToValidate="txtDire" ErrorMessage="Falta Ingreso de Dirección">*</asp:requiredfieldvalidator>
Para txtDire
RequiredFieldValidator   y
CompareValidator

<asp:requiredfieldvalidator id="rfvEdad" runat="server" Display="Dynamic" ControlToValidate="txtEdad" ErrorMessage="Ingrese Edad">*</asp:requiredfieldvalidator>

<asp:comparevalidator id="CompareValidator2" runat="server" Display="Dynamic" ControlToValidate="txtEdad" ErrorMessage="Edad mínima : 18 años" Type="Integer" Operator="GreaterThanEqual" ValueToCompare="18">**</asp:comparevalidator>

Para txtEmail
RequiredFieldValidator   y
RegularExpressionValidator

<asp:requiredfieldvalidator id="rfvEmail" runat="server" Display="Dynamic" ControlToValidate="txtEmail" ErrorMessage="Falta Ingreso de Email">*</asp:requiredfieldvalidator>

<asp:regularexpressionvalidator id="revEmail" runat="server" ControlToValidate="txtEmail" ErrorMessage="Formato de correo no valido" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">**</asp:regularexpressionvalidator>

Para txtPass1 y txtPass2
RequiredFieldValidator   y
CompareValidator

<asp:requiredfieldvalidator id="rfvPass1" runat="server" Display="Dynamic" ControlToValidate="txtPass1" ErrorMessage="Falta Password">*</asp:requiredfieldvalidator>

<asp:requiredfieldvalidator id="rfvPass2" runat="server" Display="Dynamic" ControlToValidate="txtPass2" ErrorMessage="Ingrese nuevamente el Password">*</asp:requiredfieldvalidator>

<asp:comparevalidator id="CompareValidator1" runat="server" Display="Dynamic" ControlToValidate="txtPass2" ErrorMessage="Password No coincide" ControlToCompare="txtPass1">**</asp:comparevalidator>

Para txtFecha
CompareValidator
(este es un dato opcional)

<asp:comparevalidator id="cvFecha" runat="server" Display="Dynamic" ControlToValidate="txtFecha" ErrorMessage="Fecha incorrecta, debe ser antes de la fecha actual" Type="Date" Operator="LessThan">*</asp:comparevalidator>

  • Se comprueba que la fecha sea anterior a la fecha actual
  • En el Load de la página se escribe el siguiente código

If Not Page.IsPostBack Then

cvFecha.ValueToCompare = Today

End If

Para txtFono
RequiredFieldValidator y
RegularExpressionValidator

<asp:requiredfieldvalidator id="rfvFono" runat="server" Display="Dynamic" ControlToValidate="txtFono" ErrorMessage="Falta Ingreso de Teléfono">*</asp:requiredfieldvalidator>

<asp:regularexpressionvalidator id="revFono" runat="server" Display="Dynamic" ControlToValidate="txtFono" ErrorMessage="Formato de teléfono no valido" ValidationExpression="\(\d{3}\)\-\d{3}\-\d{7}">**</asp:regularexpressionvalidator>

Nota: La expresión de Validación se ha escrito directamente según el formato, ya,ya,ya....si tu teléfono tiene otro formato aqui te doy el conjunto de caracteres que puedes utilizar.

Caracter Definición
a Debe ser un la letra a en minúsculas
1 Debe ser el número 1
? 0 o un caracter
* 0 o N caracteres
+ 1 o mas caracteres (al menos uno)
[0-n] Rango de 0 a n números enteros
{n} Longitud de n caracteres
| Separador de múltiples opciones
\ El caracter que sique es un comodín
\w Debe ser un caracter
\d Debe ser un Dígito
\. Debe ser el punto

Existen expresiones regulares como un correo, un sitio Web, etc que vienen el plantillas definidas.

Para txtValor
RequiredFieldValidator   y
RangeValidator

<asp:requiredfieldvalidator id="rfvValor" runat="server" Display="Dynamic" ControlToValidate="txtValor" ErrorMessage="Valor no ingresado">*</asp:requiredfieldvalidator>

<asp:rangevalidator id="rangefvValor" runat="server" Display="Dynamic" ControlToValidate="txtValor" ErrorMessage=" Valor fuera del rango" Type="Double" MaximumValue="800" MinimumValue="230">**</asp:rangevalidator>

Al cometer algunos errores la página se muestra de la siguiente forma, al final de la página se ha inclído un control ValidationSummary que muestra un resumen de los errores cometidos.

Controles de Validación

Recuerden votar por este artículo, sus votos me animan a seguir publicando, además que son un premio a mi esfuerzo.

Una cosilla que esta de mas: Crea un directorio Virtual y copias los archivos del empaquetado que puedes bajarlo en el enlace al final del artículo... ya sé que sabías hacerlo... no te enojes.

Reciban un fuerte abrazo (aunque un poquito atrazado) por Navidad y que todos sus sueños y proyectos se cumplan y que el próximo año sea mucho mejor del que se termina.

Feliz  año 2006 y como siempre A SEGUIR DESARROLLANDO

Ing. Fernando Luque Sánchez
De Trujillo - Perú para el mundo


Fichero con el código de ejemplo:   FernandoLuque_ASPValidar.zip - (16) KB


ir al índice principal del Guille