viernes, 22 de enero de 2010

ASP.NET – Evitar validar controles ocultos

validator Vamos a analizar una situación ( a ver si les ha pasado ya):

+Tenemos un formulario para el ingreso de información

+Todos los campos tienen controles de validación, osea… si no se ingresa alguna información… no se podrá enviar el formulario (vamos a suponer que javascript está habilitado).

+Pero a veces ocurre que, damos la opción de no ingresar algún dato… osea: Si no quieres ingresar la información esconde el control… poniéndole el check al checkbox escondemos el dropdownlist (vean la imagen),

Y obviamente no vamos a esconder el control desde el lado del servidor, osea haciendo un postback… no es necesario (eso es malo para la salud ;))… con un minímo de javascript ya está.

El problema es que si usamos javascript para ocultar el/los controles, las validaciones de esos controles que pretendemos esconder seguirán exigiendo el dato …

hagan la prueba, escondan algún control que está amarrado a un control de validación y verán que la validación sigue siendo solicitada.

Entonces, lo que tenemos que hacer es desactivar los controles de validación (también desde javascript) y asunto solucionado.

Vamos a hacer un ejemplito para demostrar esto:

Este es el código aspx + html + javascript:

<head runat="server">
<
title>xxx</title>
<
style type="text/css">
*
{
font-family: Trebuchet MS;
margin: 5px;
}
table
{
width: 40%;
border: dotted 1px green;
background-color: burlywood;
}
</style>

<
script type="text/javascript">
function
HideControls()
{
var chkLater = document.getElementById("<%=chkLater.ClientID %>");
var divUserType = document.getElementById("divUserType");
var rfvUserType = document.getElementById('<%= rfvUserType.ClientID %>');

if(chkLater.checked==true)
{
divUserType.style.display = "none";
ValidatorEnable(rfvUserType, false);
}
else
{
divUserType.style.display = "block";
ValidatorEnable(rfvUserType, true);
rfvUserType.isvalid = true;
ValidatorUpdateDisplay(rfvUserType);
}

}
</script>
</
head>
<
body>
<
form id="form1" runat="server">
<
table>
<
tbody>
<
tr>
<
th colspan="2" style="background-color: brown">
Creación de Nuevo Usuario</th>
</
tr>
<
tr>
<
td style="width: 15%">
Usuario:
</td>
<
td>
<
asp:TextBox ID="txtUser" Width="80%" runat="server"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvUser" runat="server"
ErrorMessage="*" ControlToValidate="txtUser" Display="Dynamic"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
Email:
</td>
<
td>
<
asp:TextBox ID="txtEmail" Width="80%" runat="server"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvEmail" runat="server"
ErrorMessage="*" ControlToValidate="txtEmail" Display="Dynamic"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
Contraseña:
</td>
<
td>
<
asp:TextBox ID="txtPassword" Width="80%" runat="server"></asp:TextBox>
<
asp:RequiredFieldValidator ID="rfvPassword" runat="server"
ErrorMessage="*" ControlToValidate="txtPassword" Display="Dynamic"></asp:RequiredFieldValidator>
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
&nbsp;
</td>
<
td>
&nbsp;
</td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap; vertical-align: top">
Tipo:
</td>
<
td>
<
div id="divUserType">
<
asp:DropDownList ID="ddlUserType" Width="80%" runat="server">
<
asp:ListItem Value="0" Text="(Seleccione un item)"></asp:ListItem>
<
asp:ListItem Value="1" Text="Usuario Premium"></asp:ListItem>
<
asp:ListItem Value="2" Text="Usuario Limitado"></asp:ListItem>
</
asp:DropDownList>
<
asp:RequiredFieldValidator ID="rfvUserType" runat="server"
ErrorMessage="*" ControlToValidate="ddlUserType" Display="Dynamic"
InitialValue="0"></asp:RequiredFieldValidator>
</
div>
<
asp:CheckBox ID="chkLater" Text="Después decidiré." runat="server" />
</
td>
</
tr>
<
tr>
<
td style="width: 15%; white-space: nowrap">
&nbsp;
</td>
<
td>
<
div style="width: 85%; text-align: right">
<
asp:Button ID="btnSave" runat="server" Text="Guardar datos" />
</
div>
</
td>
</
tr>
</
tbody>
</
table>
</
form>
</
body>

Eso es todo… o casi todo… lo único que me falta es amarrar el evento onclick al checkbox:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If IsPostBack Then Return

chkLater.Attributes.Add("onclick", "HideControls()")

End Sub

Para resumir:

La parte que hace todo el trabajo es el código javascript.

Espero que les sea de utilidad ;)

No hay comentarios.: