2012-11-09 9 views
10

Ciao Sto utilizzando MVC4 con convalida lato client. Questo funziona perfettamente per mostrare i messaggi di convalida accanto ai campi.Riepilogo convalida aggiornamenti in "tempo reale"

Ho aggiunto un riepilogo di convalida:

@Html.ValidationSummary(false) 

Questo funziona, lato client 'n tutti. Mi piacerebbe che si comportasse diversamente però; attualmente i messaggi nel riepilogo di convalida cambiano solo quando si fa clic sul pulsante di invio. Mi piacerebbe che fossero dinamicamente, popolati in modo simile al messaggio di convalida di ogni campo.

Qualcuno può suggerire un modo per raggiungere questo obiettivo?

Qualsiasi informazione su ciò che fa scattare l'aggiornamento di riepilogo sarebbe ottima.

+0

"Attualmente i messaggi nel riepilogo di convalida cambia solo quando si fa clic sul pulsante di invio. " Si prega di creare un violino/demo in modo che possiamo vedere cosa sta succedendo. – Mori

+0

Se aggiungi un riepilogo di convalida a qualsiasi modulo dovresti vedere il risultato – nixon

risposta

6

Ho installato il riepilogo di convalida per aggiornare in 'tempo reale' anche in considerazione quanto segue:

  1. aggiornare la sintesi sola una volta che è visibile (dopo pagina validate/submit)
  2. Chiaro il riepilogo quando tutto è valida

Diamo estrarre il validatore, showErrors overrride() e mettere in atto la nostra logica:

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

Dal momento che sto usando questa soluzione per tutto il mio sito ho creato il seguente init (onReady):

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

Ed ecco la resetSummary usato sopra:

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

Funziona abbastanza bene tranne che non mostra di nuovo il riepilogo quando si verifica il primo errore. Penso che questo possa contare come risposta, grazie. – nixon

+0

È possibile escludere if ($ ('div [data-valmsg-summary = true] li: visible'). Length) se si desidera che il sommario sia sempre aggiornato, ovviamente. –

+0

Ma se vuoi che l'aggiornamento si avvii dopo un invio e mantieni l'aggiornamento anche se tutto è valido, penso che dobbiamo mantenere questo stato. Per esempio. '$ ('form'). data ('updateSummary', true);' –

1

Il riepilogo lato client sembra essere generato quando l'intero modulo è convalidato, e puoi farlo tu stesso chiamando il metodo plugin valido(). Aggiungi questo dopo gli script di convalida jquery.

Gli eventi di esempio che ho incluso sono keyup e clic, ma è possibile aggiungere o rimuovere da questo elenco separato da spazio.

+0

O meglio ancora, potresti farlo su $ ('form'). On ('cambia', function (e) {$ (this) .valid ();}); –

+1

non è molto più semplice che scrivere un mucchio di codice? allora perché voti minori? – Prageeth