2009-03-05 6 views
9

Tengo un elemento de entrada de cuadro de texto que tiene un RequiredFieldValidator como tal:Howto hacer RequiredFieldValidator cambiar la clase css de la div padre

<div> 
    <label>First name</label> 
    <asp:RequiredFieldValidator ID="RequiredFieldValidatorFirstname" runat="server" ErrorMessage="Required" ControlToValidate="TextBoxFirstname"></asp:RequiredFieldValidator> 
    <asp:TextBox ID="TextBoxFirstname" runat="server"></asp:TextBox> 
</div> 

Cuando el cuadro de texto está vacío en enviar Quiero añadir la clase 'forma- error 'a la Div principal:

<div class="form-error"> 
    <label>First name</label> 
    <asp:RequiredFieldValidator ID="RequiredFieldValidatorFirstname" runat="server" ErrorMessage="Required" ControlToValidate="TextBoxFirstname"></asp:RequiredFieldValidator> 
    <asp:TextBox ID="TextBoxFirstname" runat="server"></asp:TextBox> 
</div> 

¿Es esto posible y, de ser así, cómo lo hago?

+0

Compruebe esto [respuesta] [1]. Espero que esto ayude, [1]: http://stackoverflow.com/questions/1301508/change-textboxs-css-class-when-asp-net-validation-fails/12805078# 12805078 – gsimoes

+0

La gente que viene para la validación de ASP.NET MVC/jQuery podría querer verificar [esta respuesta] (http://stackoverflow.com/q/10431944/1366033) – KyleMit

Respuesta

7

con RequiredFieldValidator no puede agregar su código personalizado.

debe usar asp.net customvalidator control, y escriba su propia función de validación javascript que establece la clase en el div.

+0

¡Gracias! Eso es de gran ayuda. Sin embargo, parece que cuando mi TextBox está vacío, no se invoca el script personalizado. Tiene alguna idea sobre esto? – hbruce

+3

Lo encontré: resulta que hay una opción para CustomValidator llamada ValidateEmptyText que debe establecerse. :) ¡Gracias por su ayuda! – hbruce

+0

@hbruce: de nada – Canavar

3

Creo que la siguiente opción te puede resultar útil. Básicamente, anula uno de los scripts de validación de ASP.NET. Y le agrega algo de lógica para agregar/eliminar la clase de error en div principal.

El problema que tuve que enfrentar con esta tarea fue hacer que mi script se ejecutara después de que se activaron las validaciones ya que el DOM no se vuelve a cargar. Al reemplazar este el script de validación original, tiene la capacidad de ejecutar su propio script cuando se actualiza la pantalla de validación.

De esta forma puede seguir utilizando sus otros controles de validación. Tienes que colocar la secuencia de comandos en la parte inferior de tu página o página maestra. También utilicé JQuery para simplificar las cosas.

* Tenga en cuenta que el código siguiente requiere que los validadores estén configurados para mostrar dinámicos. Si no desea que sean visibles, puede agregar una clase css y establecer la visualización: ninguna.

<script type="text/javascript"> 
    function ValidatorUpdateDisplay(val) { 
     if (typeof (val.display) == "string") { 
      if (val.display == "None") { 
       return; 
      } 
      if (val.display == "Dynamic") { 
       val.style.display = val.isvalid ? "none" : "inline"; 
       return; 
      } 
     } 
     if ((navigator.userAgent.indexOf("Mac") > -1) && (navigator.userAgent.indexOf("MSIE") > -1)) { 
      val.style.display = "inline"; 
     } 
     val.style.visibility = val.isvalid ? "hidden" : "visible"; 


     //--- Add/Remove Error Class 
     var triggeredSiblings = 0; 
     if (val.isvalid) { 
      $(val).siblings('span').each(function() { 
       if ($(this).isvalid == false) { triggeredSiblings = 1; } 
      }); 
      if (triggeredSiblings == 0) { $(val).closest("div").removeClass("error"); } 
     } else { 
      $(val).closest("div").addClass("error"); 
     } 
    } 
</script> 
+0

Corregido un error en la instrucción if –

+0

Sé que esta publicación es antigua, pero si tiene muchos validadores en la misma entrada, debe usar 'if (this.isvalid == false) {triggeredSiblings = 1; } 'en lugar de' if ($ (this) .isvalid == false) {triggeredSiblings = 1; } 'else si el segundo validador es válido pero no el primero, se elimina la clase de error. – Pouki

+0

Implementé esta solución hace un par de años en un entorno de producción, en su mayor parte fue un éxito. Dicho eso, no creo que vuelva a hacerlo.Por un lado, nunca funcionó correctamente con contenido dinámico (ocultar y mostrar). Acabamos de vivir con ese problema. Gracias por la corrección, no estoy seguro si tuve que corregir eso o no. –

8

utilizar lo siguiente:

<script> 

    $(function(){ 
     if (typeof ValidatorUpdateDisplay != 'undefined') { 
      var originalValidatorUpdateDisplay = ValidatorUpdateDisplay; 

      ValidatorUpdateDisplay = function (val) { 
       if (!val.isvalid) { 
        $("#" + val.controltovalidate).closest("div").addClass("form-error"); 
       } 

       originalValidatorUpdateDisplay(val); 
      } 
     } 
    }); 

</script> 

Este código decora la función original de ValidatorUpdateDisplay responsable de actualizar la visualización de los validadores, la actualización del ControlToValidate div más cercano.

+0

Trabajando muy bien en mi propia solución. ¡Gracias! +1 – Tillito

Cuestiones relacionadas