2010-10-14 9 views

Respuesta

31

La idea anterior sobre el uso de CSS con importantes fue tan cerca que pude saborearlo. Usando esa idea y los selectores de atributos CSS lo hice. Tuve que usar el selector "contiene" para que funcione en FF, pero ahora lo he probado en IE10, FF y Chrome y hasta ahora está funcionando. Es realmente simple. Aquí hay un validador de muestra en mi página aspx

<asp:RequiredFieldValidator runat="server" ID="rfvRequired" ErrorMessage="This is required.<br/>This is line 2" ControlToValidate="tbRequired" ValidationGroup="CommonAttributesValidationGroup" SetFocusOnError="True" CssClass="valerror" Display="Dynamic"></asp:RequiredFieldValidator> 

Siguiente Tengo un estilo para valerror.

span.valerror[style*="inline"] 
{ 
    display:block !Important; 
    background-color: Yellow; 
    border: 1px solid #cccccc; 
    font-size:.9em; 
} 

Eso es todo. Cómo funciona: cuando el span cambia el estilo de "display: none" a "display: inline", el selector de atributos del tramo entra en acción y lo fuerza a ser un bloque. Solo necesita hacer UNA entrada de CSS como la de arriba y asegúrese de hacer cada validador de esa clase.

+0

Esto funcionó muy bien para mí.He mostrado dinámicamente validadores que quería mostrar debajo de las entradas sin marcado adicional. Usando este selector de CSS y configurando la pantalla: propiedad de bloque con la palabra clave! Important hizo exactamente lo que necesitaba. Están ocultos por defecto, se muestran según sea necesario (debajo de la entrada) y se ocultan nuevamente cuando se selecciona/escribe un valor válido. ¡Gracias! –

+0

¡Esto también funcionó muy bien para mí! +1 para ayudar –

+0

¿Por qué no se acepta esto? He votado que esta es una excelente solución. –

0

Esto puede ayudar (tomado de MSDN):

El comportamiento de la pantalla depende de si la validación del lado del cliente se realiza . Si la validación del lado del cliente no está activo (ya que el navegador no soporta o porque ha sido deshabilitado por usando la directiva Page.ClientTarget página o propiedad EnableClientScript), ValidatorDisplay.Static y ValidatorDisplay.Dynamic comportarse de la misma manera: el mensaje de error ocupa el espacio solo si se muestra. La capacidad de asignar dinámicamente el espacio para el mensaje cuando no se está mostrando (ValidatorDisplay.Dynamic) solo funciona con la validación del lado del cliente .

1

Funciona con .Display = ValidatorDisplay.Static para mí, no se ha configurado EnableClientScript a true.

Actualización 1 y afectando cssClass con una clase que tiene display: block; a cada actualización regValidator

olvidarse de lo que he escrito antes, supongo que no se preocupan ahora por esto, pero para otros, yo diría , yo creo que es una olvidarse de la EM sobre regExpVal a no responder a display: block causa customValidator parece funcionar ..

Así que para el regExpValidator he descubierto que poner clear:left; y float:left funciona, y si el elemento debajo de ellos se mueve mientras aparecen los errores, usted pone clear: left en él.

3

¿Qué le parece usar !important en la clase CSS?

+0

puedo confirmar esta solución funciona y es increíblemente fácil de implementar. –

+5

Esto no funciona para los validadores dinámicos ya que anula la visualización: bloque; que los oculta en primer lugar. – alnorth29

3

He encontrado la única manera de que el control no ocupe espacio cuando está oculto y también mostrar bloque es poner una etiqueta <br /> después de cada validador.

Así que al principio tenemos esto: enter image description here

Entonces, si hay un error que se ve así: enter image description here

+0

Todavía no es un bloque, sino un elemento en línea en una línea separada. – Rolf

2

he encontrado una solución que resuelve este usando un control de plantilla:

<asp:RequiredFieldValidator runat="server" EnableClientScript="True" Display="Dynamic" > 
    <TemplateControl> 
     <span class="error">This field is required.</span> 
    </TemplateControl> 
</asp:RequiredFieldValidator> 

CSS:

.error{position:relative;display:block;} 

El html resultante es un poco desordenado, pero permite una pantalla: bloque que empuja la validación a la siguiente línea;

<span id="ctl00_###" style="color: red; display: inline; "> 
    <templatecontrol> 
     <span class="error">This field is required.</span> 
    </templatecontrol> 
</span> 
4

Simplemente envuelva el validador en un div:

<div><asp:RegularExpressionValidator id="x" runat="server"></div> 
+1

Esta es la mejor manera. – Jumpei

+0

-1 porque la pregunta es acerca de un validador con Display = "dynamic", lo que significa que no quieren que el validador sea visible hasta que el javascript determine que es un error válido y usar un div hará que el validadador ocupe espacio. –

+0

El div tiene ancho y alto de 0, siempre que el Validador no se muestre, lo que lo hace invisible. Entonces: +1 otra vez – Rolf

0

ASP.NET inyecta un archivo javascript con código de validación, es la segunda etiqueta de script después de la etiqueta del formulario en el HTML. Esto contiene una función llamada "ValidatorUpdateDisplay" para mostrar/ocultar los mensajes de validación. Esto puede ser anulado para usar diferentes javascript para mostrar/ocultar, p. si está utilizando jQuery:

ValidatorUpdateDisplay = function (val) { 
    // Show/hide this validator's error message 
    if (val.isvalid){ 
     $(val).hide(); 
    } else { 
     $(val).show(); 
    } 
} 

o en su caso:

ValidatorUpdateDisplay = function (val) { 
    // Show/hide this validator's error message 
    if (val.isvalid){ 
     val.style.display = 'none'; 
    } else { 
     val.style.display = 'block'; 
    } 
} 

En pocas palabras este código en una etiqueta de script después de la etiqueta de formulario ASP.NET apertura. Tenga en cuenta que esto afectará a todos los validadores en la página, e ignorará si la Pantalla se establece en Dinámico: si desea admitir esto, puede ampliarlo con el código de la función original o el código personalizado para verificar el tipo de validador.

Véase también esta pregunta Can you have custom client-side javascript Validation for standard ASP.NET Web Form Validators?

Cuestiones relacionadas