Pracuję z ASP.Net MVC3
, łatwiejszym sposobem korzystania z walidacji klienta byłoby włączenie jquery.validate.unobtrusive
. Wszystko działa dobrze, jeśli chodzi o rzeczy prosto z serwera.
Ale kiedy próbowałem wprowadzić nowe „dane wejściowe” za pomocą javascript i wiedziałem, że muszę zadzwonić, $.validator.unobtrusive.parse()
aby ponownie powiązać walidacje. Ale nadal wszystkie te dynamiczne pola wstrzykiwane nie działają.
Co gorsza, próbuję ręcznie bindować używając jquery.validate
i to też nie działa. jakieś pomysły?
Odpowiedzi:
Stworzyłem rozszerzenie biblioteki jquery.validate.unobtrusive, które rozwiązało ten problem w mojej sytuacji - może być interesujące.
http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/
źródło
$.validator.unobtrusive.parse()
. Ponadto wydaje się, że tylko dodaje nowe reguły, ale nie pobiera aktualizacji istniejących reguł?Wypróbowałem podejście Xhalenta, ale niestety nie zadziałało. Podejście Robin zadziałało i nie zadziałało. Działało świetnie w przypadku dynamicznie dodawanych elementów, ale jeśli spróbujesz użyć JQuery do usunięcia wszystkich atrybutów walidacji i rozpiętości z DOM, biblioteka walidacyjna nadal będzie próbowała je zweryfikować.
Jeśli jednak oprócz danych „validationData” usuniesz z formularza dane „unobtrusiveValidation”, zadziałało to jak urok do dynamicznego dodawania i usuwania elementów, które chcesz zweryfikować lub nie.
źródło
validator
nie jest zdefiniowany? Mam odniesienia do walidacji i validation.unobtrusive. Walidacja działa do momentu wywołania tego kodu$('#form').validate({ignore: ""})
Naprawdę podoba mi się prostota rozwiązań @viggity i @Robins, więc przekształciłem je w szybką, małą wtyczkę:
Przykładowe użycie:
źródło
Mam ten sam problem. Odkryłem, że nie można dwukrotnie wywołać $ .validator.unobtrusive.parse () w tym samym formularzu. Podczas ładowania formularza początkowo z serwera formularz jest analizowany automatycznie przez dyskretną bibliotekę. Gdy dodasz element wejściowy dynamicznie do formularza i ponownie wywołasz $ .validator.unobtrusive.parse (), to nie zadziała. To samo dotyczy parseElement ().
Dyskretna biblioteka wywołuje metodę validate wtyczki jquery validate w celu ustawienia wszystkich reguł i komunikatów. Problem polega na tym, że po ponownym wywołaniu wtyczka nie aktualizuje nowego zestawu reguł, który podał.
Znalazłem jedno prymitywne rozwiązanie: przed wywołaniem metody analizy na dyskretnej bibliotece lib wyrzucam walidator formularzy:
Teraz, gdy metoda validate jest wywoływana przez dyskretną bibliotekę, wszystkie reguły i komunikaty są odtwarzane, w tym dynamicznie dodawane dane wejściowe.
Mam nadzieję że to pomoże
źródło
Używam MVC 4 i JQuery 1.8, wygląda na to, że następujący fragment kodu jest potrzebny, aby umożliwić Jquery sprawdzanie poprawności zawartości dynamicznie wstrzykiwanej przez Ajax lub Jquery do DOM.
Zrobiłem funkcję modułową, która akceptuje obiekt Jquery nowo dodanego elementu. Jeśli sklonowałeś nową tabelę z identyfikatorem
tblContacts
za pomocą Jquery po kliknięciu przycisku, dołącz poniższą funkcję do pliku jsi nazwij to tak:
źródło
Dlaczego nie użyć funkcji reguł bezpośrednio z dokumentu walidacji jQuery. Lubię to:
źródło
Czerpiąc z rozwiązania Xhalenta oznaczonego jako odpowiedź powyżej, nieco go rozwinąłem.
Więc zasadniczo działa tak samo jak powyższe rozwiązanie Xhalent, ale dodałem możliwość usuwania reguł dla elementów, które usuwasz z domeny. Tak więc, gdy usuniesz elementy z Doma i chcesz, aby te reguły walidacji również zostały usunięte, wywołaj:
źródło
Znalazłem skrypt kodu @ Xhalent w moim kodzie i zamierzałem go usunąć, ponieważ go nie używałem, co doprowadziło mnie do tego pytania SO.
Ten kod jest całkiem przejrzysty i prosty:
Następnie, aby wywołać to rozszerzenie jQuery, po prostu użyj selektora, aby pobrać formularz:
Altówka!
źródło
Spróbowałem odpowiedzi Viggity i na początku wszystko wydawało się działać. Ale po chwili zauważyłem, że walidacja staje się boleśnie wolniejsza, im bardziej dynamicznie dodawałem pozycje. Powodem było to, że jego rozwiązanie nie usuwa powiązań programów obsługi zdarzeń, ale za każdym razem dodaje nowe. Więc jeśli dodasz 5 pozycji, walidacja zostanie wykonana 6 razy, a nie tylko raz. Aby to naprawić, musisz dodatkowo usunąć powiązanie zdarzeń z wywołaniami removeData.
źródło
W przypadku zawartości dynamicznej musisz zaktualizować Unobtrusive Validations jak poniżej i sprawdzić, czy
Form
jest ważny podczas przesyłania.źródło
Bawiłem się tym przez jakiś czas, wyrzucając rozwiązania i próbując ponownie później (kiedy miałem trochę wolnego czasu, wierz lub nie).
Nie jestem pewien, czy to zachowanie zmieniłoby się w nowszych wersjach jquery (używamy 1.7.2), odkąd ten wątek został utworzony lub skomentowany jako ostatni, ale stwierdziłem, że
.parseElement(inputElement)
działa dobrze, gdy próbuję dodać dynamicznie utworzone elementy do formularza który ma już załadowany walidator. Zasugerował to już @jamesfm (15 lutego 2011) w jednym z powyższych komentarzy, ale przeoczyłem to kilka razy, gdy nad tym pracowałem. Dlatego dodaję to jako oddzielną odpowiedź, aby uczynić ją bardziej oczywistą i ponieważ uważam, że jest to dobre rozwiązanie i nie wymaga tak dużego obciążenia. Może to nie mieć zastosowania do wszystkich kwestii poruszonych w kolejnych odpowiedziach, ale myślę, że byłoby to rozwiązanie pierwotnego pytania. Oto jak sprawiłem, że mój działa:źródło
Po pierwsze, myślę, że wywołanie powinno być skierowane do .validator, a nie do walidacji, wtedy musisz podać identyfikator formularza
źródło
Jeśli chcesz dodawać i usuwać rzeczy z możliwością, że niektóre błędy są już wyświetlane, oto co przyszedłem. Opiera się głównie na różnych pomysłach na tej stronie z pytaniami. Używam wbudowanego
destroy()
zamiast po prostu usuwać atrybut danych dla walidacji JQuery.Wywołujesz to przed dynamiczną modyfikacją danych wejściowych w formularzu. Następnie ponownie zainicjuj walidację po.
Uwaga: Jeśli niektóre lub wszystkie dane wejściowe zostały sprawdzone i zawierają błędy, te błędy zostaną zresetowane ... ale powrócą poprawnie podczas następnej weryfikacji.
źródło