jueves, 26 de marzo de 2009

ASP.NET – Un validator para múltiples controles

customval Ya conocemos los controles de validación de ASP.NET, y también sabemos que trabajan sobre un control, no sobre múltiples controles... recordarás que tienen una propiedad llamada ControlToValidate.

Pero, hay ocasiones en las que tenemos dos controles.. y nos basta si se ingresa información a alguno de ellos... no necesariamente a ambos... pero por lo menos uno de ellos debe recibir un valor.

Con los controles de validación que tenemos no nos alcanza... por lo menos no en su forma común... pero se puede usar un sólo validator para verificar multiples controles?

claro que sí, ahora lo vamos a demostrar:

Creamos un pequeño formulario que nos permita ingresar el nombre y el alias de un usuario... el control de validación deberá exigir que al menos se inngrese uno de los datos.

El control que realizará esta validación será el CustomValidator, veamos cómo quedaría nuestro código aspx…

Este es el javascript que deben poner en el head de la página:

<script type="text/javascript">
function CustomValidator_ClientValidate(source, args)
{
var nombre = document.getElementById("<%=txtNombre.ClientID %>");
var alias = document.getElementById("<%=txtAlias.ClientID %>");
if ((nombre.value + alias.value) == "")
args.IsValid = false;
else
args.IsValid = true;
}
</script>

y el sgte es el código que pondremos dentro del tag FORM:

Nombre:<asp:TextBox ID="txtNombre" runat="server"></asp:TextBox>
<br />
Alias:<asp:TextBox ID="txtAlias" runat="server"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="Enviar datos" />

<asp:CustomValidator ID="CustomValidator1" runat="server"
ErrorMessage="Al menos ingrese un dato!"
ValidateEmptyText="true"
Display="Dynamic"
ClientValidationFunction="CustomValidator_ClientValidate"
OnServerValidate="CustomValidator_ServerValidate">
</asp:CustomValidator>

Luego el código-beside:
Protected Sub CustomValidator_ServerValidate( _
ByVal source As Object, ByVal args As ServerValidateEventArgs)

If txtNombre.Text & txtAlias.Text = "" Then
args.IsValid = False
Else
args.IsValid = True
End If

End Sub

Aquí lo que hay que comentar es que estoy usando una función javascript CustomValidator_ClientValidate, desde la cual hago la verificación de ambos controles… y adicionalmente, tenemos el método CustomValidator_ServerValidate, el cual realiza la misma verificación, pero desde el servidor, ya que como sabemos, el javascript puede estar deshabilitado en el browser y la función no se ejecutaría… para eso prevenimos entonces usando el método CustomValidator_ServerValidate.

Ojo, que no estamos usando la propiedad ControlToValidate del CustomValidator en este caso.

Es todo. Cualquier duda, posteen su comentario.

2 comentarios:

Sergio E. dijo...

Hola, interesante punto de vista, sin embargo yo como lo hago es en el evento servervalidate del customvalidator pongo todos las validaciones que me interesen, pongo un pequeño ejemplo:

Protected Sub CustvalFecha_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles customvalidator1.ServerValidate
Dim res As Boolean = True
if string.isnullorempty(textbox1.text) orelse string.isnullorempty(textbox2.text)
res = False
endif
args.IsValid = res
End Sub

Segundo Serrano dijo...

Hola Sergio Enríquez,

Gracias por tu comentario.
Claro, si te darás cuenta... también lo estoy usando en la parte final del código.

Saludos.