2009-04-07 21 views
6

que tengo un modelo que hace algunas comprobaciones de validación y se suma a los errores ModelState:establecer el foco en el modelo errores ASP.NET MVC

ViewData.ModelState.AddModelError("mycontrol", "message") 

En ellas se muestran muy bien en la vista lateral, pero hay una forma de establecer el foco para el control que corresponde al mensaje de validación? En este momento, la página se actualiza y permanece en la parte superior de la página, por lo que si el error se encuentra hacia el final de la página, no es obvio para el usuario lo que sucedió.

Nota: Otra solución sería que ValidationSummary muestre la lista de errores en la parte superior de la página, pero nunca he podido mostrar nada. Todos mis errores se muestran a través de ValidationMessage.

Editar: Encontré mi problema con ValidationSummary. El margen de beneficio que tenía era:

<% Html.ValidationSummary()%> 

que debería haber sido:

<%=Html.ValidationSummary()%> 

todavía me gustaría saber cómo se ajuste a la cancha con el error sin embargo.

+0

ValidationSummary debería estar funcionando. Lo hace por mi ¿Puede mostrarnos algunas de sus marcas (quizás simplificadas al omitir html estático)? La extensión HtmlHelper observa el mismo estado del modelo para representar los errores. – tvanfosson

+0

Llegué a la mitad de publicar mi código de muestra cuando noté que faltaba "=" en el marcado (y se colocó la palma abierta en la frente). – gfrizzle

Respuesta

24

Algunos jQuery bondad para desplazarse a la primera entrada con un error. Lo difícil es que debe obtener el elemento DOM subyacente ANTES de invocar el foco() cuando el método focus() en un objeto jQuery desencadena el evento de enfoque en lugar de centrarlo en el elemento.

<script type='text/javascript'> 
    $(document).ready(function() 
    { 
     var input = $('.input-validation-error:first'); 

     if(input) 
     { 
      input.focus(); 
     } 
    }); 
</script> 
+0

Buena solución. Solo tuve que agregar "return false" para que funcione. if (input) { input.focus(); devuelve falso; } –

+0

@HallgeirEngen que realmente no debería ser necesario. Todo lo que hará es abortar la ejecución del controlador listo. Si tiene algún código después de eso, no se ejecutará. – tvanfosson

1

Puede usar JavaScript para buscar los elementos de entrada en la página que tienen agregada la clase de validación MVC HTML (entrada-validación-error), y mover el quilate al primero. Eso/debería/mover la pantalla a ese elemento aunque no lo he probado.

Una biblioteca JS como jQuery lo hará sencillo.

Cuestiones relacionadas