2012-11-06 11 views
10

Próbuję poprawnie sprawdzić poprawność i zresetować formularz. Sprawdzanie poprawności działa poprawnie - wymagane pola są pomyślnie monitorowane. Kiedy jednak przejdę do resetowania mojego formularza, widzę tylko czerwone tło dla danych wejściowych, a nie komunikaty sprawdzania poprawności.jQuery dyskretny formularz sprawdzania poprawności nie ukrywa komunikatów o błędach podczas resetowania formularza

Według jQuery validate documentation:

Przywraca wejściowe pola do ich pierwotnej wartości (wymaga wtyczki formularz), usuwa klas wskazujących nieprawidłowe elementy i ukrywa komunikaty o błędach.

Oto wszystkie informacje, które uważam za istotne dla problemu. Proszę dać mi znać, jeśli chciałbyś zobaczyć cokolwiek innego.

Oto jak generuję element DOM w moim modelu. Ten element wymaga sprawdzenia poprawności:

//Model.ascx 
<div class="detailsRow required"> 
    <%= Html.LabelFor(model => model.Site) %> 
    <%= Html.DropDownListFor(model => model.SelectedSiteID, new SelectList(Model.Site, "Key", "Value"))%> 
    <%= Html.ValidationMessageFor(model => model.SelectedSiteID)%> 
</div> 

//Model.cs 
[DisplayName("Site")] 
public List<KeyValuePair<int, string>> Site { get; set; } 

[Range(0, int.MaxValue, ErrorMessage = "Site required")] 
public int SelectedSiteID { get; set; } 

Strona jest listą wyboru rozpoczynającą się od wartości -1. Każdy inny wybór jest ważny. W związku z tym potwierdzam w zakresie od 0 do maks.

ciągu w JavaScript, biegnę następujący kod przed moim formularzu, gdy użytkownik naciśnie „Wyślij” przycisk na formularzu:

var form = workflowDialogContent.find('form'); 
$.validator.unobtrusive.parse(form); 
//Maintain a reference to the current formValidator to be able to reset. 
var formValidator = $.data(form[0], 'validator'); 

if (form.valid()) { 
} 

Po naciśnięciu użytkownik złożyć formularz jest zatwierdzony i moja wiadomość walidacji jest wyświetlany, jeśli wybrana witryna ma wartość -1.

Teraz, gdy zmiana jest zmieniana, chcę zresetować mój formularz. Wziąłem tę logikę od: How to clear Jquery validation error messages?

$(window).on('change', '#SelectedSiteID', function() { 
    //Returns the formValidator we maintained a reference to. 
    var validator = WorkflowDialogBuilder.getCurrentFormValidator(); 
    validator.resetForm(); 
    //TODO: resetForm's documentation says that it hides the errors, but I did not experience this, so I am doing it manually. 
    //$('.field-validation-error').empty(); 
} 

Jednak, kiedy uruchomić ten kod ... podświetlenie jest usuwana, ale komunikaty o błędach pozostanie. Jeśli zadzwonię do kodu komentarza - błędy sprawdzania poprawności są ukryte, ale nie pojawiają się ponownie przy następnym sprawdzeniu poprawności mojego formularza.

Po walidacji: enter image description here Po wywołaniu resetForm: enter image description here

Jakieś pomysły dlaczego miałbym być widząc takie zachowanie?

Aktualizacja: W pracy wokół następujący fragment kodu wydaje się robić właściwy clean-up:

$('.field-validation-error').empty(); 
+0

Jeśli poprawnie przywołuję, sprawdzanie poprawności nie pokazuje i ukrywa komunikatów o błędach, ale po prostu dodaje tekst do zakresu, który jest zawsze widoczny. Aby ręczne rozwiązanie działało, po prostu zrób to samo i opróżnij ręcznie "błąd sprawdzania poprawności pola." Dlaczego nie działa po wyjęciu z pudełka, nie wiem ...:/ – Tallmaris

+0

Dobry pomysł . Jest to wykonalne obejście, które rozwiązuje problem, ale pozostawi to otwarte na jakiś czas. Dziękuję Ci! –

+0

Jeśli w sposób drastyczny ładujesz ten formularz okna dialogowego, przydatne może być to pytanie: http://stackoverflow.com/questions/4406291/jquery-validate-unobtrusive-not-working- with -dynamic-injected-elements –

Odpowiedz

0

myślę można dodać to do obejścia:

var form = $("#MyFormId"); 
form.find(':input').removeClass("input-validation-error"); 

Pozdrawiam

0

dlaczego nie jak tylko zmieniono pole

$('#myFormId input').on('change', function(){ 
    validator.element($(this)); 
}); 
0

Jedynym problemem związanym z udzielonymi do tej pory odpowiedziami jest to, że wszystkie błędy znikają, a nie tylko te, które chcesz.Miałem podobny problem z uzyskaniem adresu, a jeśli stanem jest DC, wymagam wprowadzenia kwadrantu (NW, NE, SW, SE). Dodaję i usuwam wymaganie za pomocą jquery, a następnie zawijam @ Html.ValidationMessageFor() w div, a następnie po prostu ukrywam div, gdy wybrany jest inny stan.

0

używasz poniżej, prawda?

var form = workflowDialogContent.find('form'); 

następnie należy użyć

form.resetForm(); 

zresetować formularz, to będzie działać.

Powiązane problemy