2012-11-09 26 views
10

Witam Używam MVC4 z walidacją po stronie klienta. Działa to doskonale, gdy wyświetlane są komunikaty sprawdzania poprawności obok pól.Aktualizacja podsumowania sprawdzania poprawności w czasie rzeczywistym

Dodałem podsumowanie Walidacja:

@Html.ValidationSummary(false) 

To działa, po stronie klienta „n wszystko. Chciałbym jednak, żeby zachowywało się inaczej; obecnie wiadomości w podsumowaniu sprawdzania poprawności zmieniają się tylko po kliknięciu przycisku przesyłania. Chciałbym, aby były dynamiczne, wypełnione w podobny sposób do komunikatu walidacyjnego każdego pola.

Czy ktoś może zaproponować sposób osiągnięcia tego?

Wszelkie informacje na temat tego, co uruchamia aktualizację zbiorczą, byłyby świetne.

+0

„Aktualnie wiadomości w podsumowaniu sprawdzania poprawności zmienia się tylko po kliknięciu przycisku "Wyślij". " Utwórz skrzypce/demo, abyśmy mogli zobaczyć, co się dzieje. – Mori

+0

Jeśli dodasz podsumowanie weryfikacji do dowolnej formy, powinieneś zobaczyć wynik: – nixon

Odpowiedz

6

Wcześniej skonfigurować podsumowanie walidacji do aktualizacji w „czasie rzeczywistym” także z uwzględnieniem następujących:

  1. zaktualizować podsumowanie tylko raz to widoczne (po stronie validate/submit)
  2. Wyczyść podsumowanie, kiedy wszystko jest ważne

Niech wyodrębnić walidator, Zignorować showErrors() i wdrożyć naszą logikę:

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(); 
    } 
} 

Ponieważ używam tego rozwiązania dla całej mojej stronie stworzyłem następujące 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(); 
      } 
     }; 
    } 
}); 

A oto resetSummary stosowane powyżej:

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

Działa całkiem dobrze, ale nie pokazuje podsumowania ponownie po wystąpieniu pierwszego błędu. Myślę, że to może się jednak liczyć jako odpowiedź, dzięki. – nixon

+0

Możesz wykluczyć, jeśli ($ ("div [data-valmsg-summary = true] li: visible '). Length), jeśli zawsze chcesz, aby podsumowanie zostało zaktualizowane, oczywiście. –

+0

Ale jeśli chcesz, aby aktualizacja została uruchomiona po przesłaniu i nadal aktualizowana, nawet jeśli wszystko jest w porządku, uważam, że musimy zachować ten stan. Na przykład. '$ (" formularz ") .danych (" updateSummary ", prawda);' –

1

Podsumowanie strony klienta wydaje się generowane po sprawdzeniu poprawności całego formularza i można to zrobić samodzielnie, wywołując metodę wtyczki valid(). Dodaj to po skryptach sprawdzania poprawności jquery.

<script> 
    $(function() { 
     $(':input').on("keyup click", function() { 
      $('form').valid(); 
     }); 
    }); 
</script> 

Przykładowe zdarzenia mam włączone są keyup i kliknij ale można dodać lub usunąć z tego miejsca listy rozdzielone.

+0

Albo jeszcze lepiej, możesz to zrobić na $ ("formularz"). On ("change", function (e) {$ (this) .valid ();}); –

+1

Czy to nie jest o wiele łatwiejsze niż pisanie paczki kodu? to dlaczego mniej głosów? – Prageeth

Powiązane problemy