2011-03-06 19 views
12

Tengo problemas para que la validación asp.net MVC del lado del cliente funcione como yo lo desee.asp.net mvc 3 resumen de validación que no se muestra a través de la validación no intrusiva

Lo tengo funcionando básicamente, sin embargo, el resumen de validación no se muestra hasta que el usuario hace clic en el botón Enviar, aunque las entradas individuales se destaquen como inválidas como pestañas/clics del usuario, etc. a través del formulario. Todo esto sucede en el lado del cliente.

Hubiera pensado que el resumen de validación se mostraría tan pronto como se descubriera que un campo de entrada no era válido.

¿Es este comportamiento por diseño? ¿Hay alguna forma de evitarlo, ya que me gustaría que se muestre el resumen de validación tan pronto como se descubra que uno de los campos de entrada no es válido?

Mi código es básicamente,

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
... 
    @using (Html.BeginForm()) 
    { 
     @Html.ValidationSummary(false) 
     @Html.EditorFor(model => model); 
     ... 

Y mis _Layout.cshtml referencias jquery-1.4.4.min.js.

+0

De acuerdo con los autores de Pro marco ASP.NET MVC 3 por Apress, esto es por diseño. En su capítulo sobre validación de modelos, tienen un ejemplo de validación del lado del cliente y señalan que, aunque los mensajes por campo se actualizan cuando se modifica la entrada, el resumen de validación solo cambia cuando se presiona el botón de envío del formulario. (Mencionan esto en las páginas 630-632.) – ngm

Respuesta

4

se puede configurar el resumen de validación para ser disparado mucho más a menudo, en onready:

var validator = $('form').data('validator'); 
validator.settings.showErrors = function (map, errors) { 
    this.defaultShowErrors(); 
    this.checkForm(); 
    if (this.errorList.length) 
     $(this.currentForm).triggerHandler("invalid-form", [this]); 
    else 
     $(this.currentForm).resetSummary(); 
    } 
} 

Aquí está la resetSummary utilizado anteriormente:

jQuery.fn.resetSummary = function() { 
    var form = this.is('form') ? this : this.closest('form'); 
    form.find("[data-valmsg-summary=true]") 
     .removeClass("validation-summary-errors") 
     .addClass("validation-summary-valid") 
     .find("ul") 
     .empty(); 
    return this; 
}; 
+0

Gran solución, funciona para mí. El único cambio que tuve fue colgarlo del validador. –

2

Tengo una pregunta similar abierta aquí: How to display MVC 3 client side validation results in validation summary pero la solución sugerida por Darin no parece funcionar como yo (y probablemente usted) quiera.

+0

Sí, parece que tenemos esencialmente el mismo problema – StanK

+0

He estado investigando el código jquery.validate.unobtrusive.js. y por lo que puedo decir, la función que establece el resumen de validación es la función onErrors, que no se llama hasta que el usuario intente enviarla. – StanK

4

he usado una versión de Torbjorn Nomells responder

Excepto que cuelgo resetSummary del objeto validador

$.validator.prototype.resetSummary= function() { 
    var form = $(this.currentForm); 
    form.find("[data-valmsg-summary=true]") 
     .removeClass("validation-summary-errors") 
     .addClass("validation-summary-valid") 
     .find("ul") 
     .empty(); 
    return this; 
}; 

entonces el cambio llamando a

$.validator.setDefaults({ 
    showErrors: function (errorMap, errorList) { 
     this.defaultShowErrors(); 
     this.checkForm(); 
     if (this.errorList.length) { 
      $(this.currentForm).triggerHandler("invalid-form", [this]); 
     } else { 
      this.resetSummary(); 
     } 
    } 
}); 
Cuestiones relacionadas