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?