sábado, 4 de abril de 2009

ASP.NET – Validar controles agrupados con ValidationGroup

validationgroup En aquellos tiempos, una página web html podía (y puede) tener varios formularios para enviar información… me refiero a las páginas html (o php, o asp) … pero las páginas ASP.NET sólo pueden tener un formulario con runat=”server” dentro de su contenido.

Pero cómo hacemos si tenemos varias funcionalidades que necesitan enviar información por separado entonces?

Es simple… creas grupos de controles… por decir el grupo Login, que le permite al usuario loguearse e ingresar al sistema, este grupo tendría una caja de texto para ingresar el nombre de usuario y otra caja de texto para ingresar el password… podrías crear también otro grupo llamado GetPassword, que le permite al usuario solicitar su password si es que lo ha olvidado… y para hacer que la información se valide por separado…

Veamos el ejemplo:

<form id="form1" runat="server">

<fieldset>
<legend>Login</legend>
User:<asp:TextBox ID="txtUser" runat="server" ValidationGroup="Login"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="*" ValidationGroup="Login" ControlToValidate="txtUser" Display="Dynamic"></asp:RequiredFieldValidator>
<br />
Password:<asp:TextBox ID="txtPassword" TextMode="Password" ValidationGroup="Login" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="*" ValidationGroup="Login" ControlToValidate="txtPassword" Display="Dynamic"></asp:RequiredFieldValidator>
<br />
<asp:Button ID="btnLogin" runat="server" ValidationGroup="Login" Text="Login" />
</fieldset>

<br />

<fieldset>
<legend>I&#39;ve forgotten my password</legend>
Email:<asp:TextBox ID="txtEmail" runat="server" ValidationGroup="GetPassword"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ErrorMessage="*" ValidationGroup="GetPassword" ControlToValidate="txtEmail" Display="Dynamic"></asp:RequiredFieldValidator>
<br />
<asp:Button ID="btnGetPassword" runat="server" ValidationGroup="GetPassword"
Text="Get Password" />
</fieldset>

</form>

Lo que estoy haciendo es crear dos grupos de controles… diferenciados por el ValidationGroup atributo, cada grupo tiene su propio botón para submitir la información…


Pero esto, no es suficiente, como aprecian la validación se está haciendo con controles de validación, osea javascript… pero esta validación puede ser burlada muy fácilmente, cómo? simplemente desactivando el javascript del browser.

Nosotros vamos a añadir una verificación adicional, peor esta vez será del lado del servidor. Entonces, para validar cada grupo de controles por separado, dentro del botón correspondiente, simplemente ponemos:

Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click
Page.Validate("Login")

If Page.IsValid Then
'continue your logic
Else
'error
End If
End Sub

Protected Sub btnGetPassword_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGetPassword.Click
Page.Validate("GetPassword")

If Page.IsValid Then
'continue your logic
Else
'error
End If
End Sub

Fíjense que la línea que hace todo el trabajo de validar sólo un grupo de controles es Page.Validate(tu_grupo_de_validacion)

;)

3 comentarios:

Unknown dijo...

Una pregunta, he probado lo que explicaste aqui, pero al utilizar los enter en las cajas siempre me valida el primer boton.
Es posible hacer que cuando se presion en las cajas de login haga el submit por login, y en la caja de recuperacion de contraseña que no valide el login y haga el submit del segundo grupo?

Segundo Serrano dijo...

Hola GeekZero,

Una solución rápida para tu caso:
1.- añade un control asp:panel para cada grupo de controles.
2.- configura la propiedad DefaultButton de cada panel al respectivo botón que quieres que se ejecute cuando presiones Enter.

La otra solución sería usar un código javascript, pero creo que con lo que te expliqué arriba es suficiente.

Saludos.

Unknown dijo...

Justamente queria evitar escribir codigo js para esto.
Ha funcionado lo del panel, muchas gracias por la ayuda :D
Saludos.-