2012-03-07 10 views
6

menudo Llegamos a tener problemas con los validadores .NET en elementos que están ocultos usando javascript/css (es decir, pantalla:. Ninguno)Ignorar .NET validadores si el elemento está oculto (display: none)

Por ejemplo (que puede ser errores de sintaxis, pero no se preocupe por ello)

<asp:CheckBox ID="chkNewsletter" runat="server" Checked="true" /> 
... 
<div id='newsletterOnly'> 
    <asp:TextBox ID="txtEmail" runat="server" /> 
    <asp:RequiredFieldValidator ID="vldEmail" ControlToValidate="txtEmail" ErrorMessage="Required" runat="server" /> 
</div> 

con JavaScript:

$('#chkNewsletter').changed(function() { 
    $(this).is(':checked') ? $('#newsletterOnly').show() : $('#newsletterOnly').hide(); 
}); 

no debe validar txtEmail si Está oculto.
No se puede enviar el formulario si newsletterOnly está oculto, porque el RequiredFieldValidator sigue siendo eficaz apesar de que se oculta :(
Y ni siquiera puede ver el mensaje de error de validación porque está escondido

Está hay alguna forma de evitar esto?

que estoy tratando de evitar las devoluciones de datos para mejorar la experiencia del usuario.
me gustaría poder modificar .NET javascript para validar controles sólo cuando son visibles.

+0

¿Ha intentado deshabilitar los elementos ocultos? Esperaría que esa sea la solución. –

+0

¿Qué hay de la posibilidad de utilizar dos modelos de vista diferentes al publicar en el servidor: uno para cada una de las diferentes situaciones? Solo necesitarías publicar en dos rutas diferentes. – Eli

+0

Como alternativa, necesitaría hacer su validación en javascript, en lugar de hacerlo en el servidor. – arcynum

Respuesta

9

escribí este como una solución general (se puede usar en todos los sitios web de .NET).

Solo necesita agregar un OnClientClick al botón de enviar.

//=================================================================== 
// Disable .NET validators for hidden elements. Returns whether Page is now valid. 
// Usage: 
// <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="DisableHiddenValidators()" /> 
//=================================================================== 
function DisableHiddenValidators() { 
    for (var i = 0; i < Page_Validators.length; i++) { 
    var visible = $('#' + Page_Validators[i].controltovalidate).is(':visible'); 
    ValidatorEnable(Page_Validators[i], visible) 
    } 
    return Page_ClientValidate(); 
} 

Para usarlo, basta con incluir lo anterior javascript y añadir la clase OnClientClick="DisableHiddenValidators()" al botón de enviar:

<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="DisableHiddenValidators()" /> 

EDIT: jQuery $(submitButton).click función no funciona en el iPhone/Android. He cambiado ligeramente el código de muestra anterior.

Si alguien ver nada mal o mejoras posibles favor comentar :)

+0

A menos que esté haciendo algo mal. Esto desactiva todos los validadores en la página. Incluso los más visibles? – Obsidian

+0

No debería. ¿La variable visible está configurada correctamente para ti? – Aximili

Cuestiones relacionadas