Mam problemy z próbą uzyskania dyskretnej walidacji jQuery do pracy z częściowym widokiem, który jest ładowany dynamicznie przez wywołanie AJAX.
Spędziłem dni próbując zmusić ten kod do działania bez powodzenia.
Oto widok:
@model MvcApplication2.Models.test
@using (Html.BeginForm())
{
@Html.ValidationSummary(true);
<div id="res"></div>
<input id="submit" type="submit" value="submit" />
}
Częściowy widok:
@model MvcApplication2.Models.test
@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);
<script type="text/javascript" >
$.validator.unobtrusive.parse(document);
</script>
Model:
public class test
{
[Required(ErrorMessage= "required field")]
public int MyProperty { get; set; }
}
Kontroler:
public ActionResult GetView()
{
return PartialView("Test");
}
i na koniec javascript:
$(doument).ready(function () {
$.ajax({
url: '/test/getview',
success: function (res) {
$("#res").html(res);
$.validator.unobtrusive.parse($("#res"));
}
});
$("#submit").click(function () {
if ($("form").valid()) {
alert('valid');
return true;
} else {
alert('not valid');
return false;
}
});
Walidacja nie działa. Nawet jeśli nie wypełnię żadnych informacji w polu tekstowym, zdarzenie przesyłania pokazuje alert („ważny”).
Jeśli jednak zamiast dynamicznie ładować widok, używam @Html.Partial("test", Model)
do renderowania częściowego widoku w głównym widoku (i nie wykonuję wywołania AJAX), wtedy walidacja działa dobrze.
Dzieje się tak prawdopodobnie dlatego, że jeśli ładuję zawartość dynamicznie, kontrolki jeszcze nie istnieją w DOM. Ale wykonuję wywołanie, $.validator.unobtrusive.parse($("#res"));
które powinno wystarczyć, aby pozwolić walidatorowi o nowo załadowanych kontrolkach ...
Czy ktoś może pomóc?
unobtrusive.parse
funkcja przyjmuje selektor jako argument, a nie element.Odpowiedzi:
Jeśli spróbujesz przeanalizować formularz, który został już przeanalizowany, nie zostanie on zaktualizowany
To, co możesz zrobić, dodając element dynamiczny do formularza, to jedno i drugie
Możesz usunąć weryfikację formularza i ponownie ją zweryfikować w następujący sposób:
Uzyskaj dostęp do
unobtrusiveValidation
danych formularza za pomocądata
metody jQuery :następnie uzyskaj dostęp do kolekcji reguł i dodaj nowe atrybuty elementów (co jest nieco skomplikowane).
Możesz również zapoznać się z tym artykułem na temat stosowania dyskretnej walidacji jQuery do zawartości dynamicznej w ASP.Net MVC dla wtyczki używanej do dodawania elementów dynamicznych do formularza. Ta wtyczka wykorzystuje drugie rozwiązanie.
źródło
$("form").data("validator").settings
zostaną usunięte$(formSelector).removeData("validator")
i zastąpione ustawieniami domyślnymi z$.validator.defaults
podczas ponownego parsowania formularza. Jest to świetny sposób na uwzględnienie pól dynamicznych, ale pamiętaj, aby powtórzyć każdy niestandardowy kod inicjujący przy każdej nowej analizie.Jako dodatek do odpowiedzi Nadeema Khedra ...
Jeśli dynamicznie załadowałeś formularz do swojego DOM, a następnie zadzwoń
(z wymienionymi dodatkowymi bitami), a następnie wyślemy ten formularz używając AJAX pamiętaj o wywołaniu
która zwraca prawdę lub fałsz (i uruchamia faktyczną weryfikację) przed przesłaniem formularza.
źródło
dodaj to do swojego _Layout.cshtml
źródło
Co zaskakujące, kiedy przeczytałem to pytanie, oficjalna dokumentacja ASP.NET nadal nie zawierała żadnych informacji o dyskretnej
parse()
metodzie ani o tym, jak jej używać z dynamiczną zawartością. Pozwoliłem sobie stworzyć problem w repozytorium dokumentów (odwołując się do oryginalnej odpowiedzi @ Nadeem) i przesłać żądanie ściągnięcia, aby go naprawić. Te informacje są teraz widoczne w sekcji walidacji po stronie klienta w temacie walidacji modelu.źródło
przetestuj to:
źródło
Uderzył mnie ten sam problem i nic nie działało poza tym:
i dodaj
gdzie próbujesz zapisać formularz.
Zapisałem formularz przez połączenie Ajax.
Mam nadzieję, że to komuś pomoże.
źródło
po prostu skopiuj ten kod ponownie na końcu kodu modalnego
;)
źródło