Защо валидирането на формуляр не работи в MVC3 частични изгледи?

Някой? Има друг въпрос относно това, но единствените отговори бяха да се кодира някакво валидиране на javascript, което също отказва да работи върху моя частичен изглед („$ не е дефиниран“).

Както и да е, не искам да използвам javascript, просто искам проста проверка за задължителни полета, които не могат да се оставят празни, полета с числа, които изискват int и т.н.

Може ли някой да хвърли малко светлина върху валидирането и частичните изгледи?


person DevDave    schedule 09.11.2011    source източник
comment
Може ли да видим някакъв код, моля?   -  person simonlchilds    schedule 09.11.2011
comment
Трябва ли да покажа някакъв код? Валидирането в частични изгледи изглежда е общ проблем с MVC3 (или дори MVC2) и такъв, който не изглежда да има много решение, различно от заобикаляне на Javascript.   -  person DevDave    schedule 09.11.2011
comment
@Tyler, да, трябва да покажете някакъв код, който позволява да се възпроизведе проблемът. Лично аз никога не съм имал проблеми с валидирането от страна на клиента в части в ASP.NET MVC.   -  person Darin Dimitrov    schedule 09.11.2011
comment
добре, това е просто много код с 3 частични изгледа. вероятно твърде много за публикуване тук. и след като се огледах, си помислих, че това е общ проблем   -  person DevDave    schedule 09.11.2011
comment
възможен дубликат на jquery.validate.unobtrusive не работи с динамично инжектирани елементи   -  person Jon Egerton    schedule 30.01.2013


Отговори (2)


Подозирам, че зареждате тези частични изгледи с помощта на AJAX. Ако случаят е такъв, ще трябва ръчно да извикате метода $.validator.unobtrusive.parse, след като инжектирате новото съдържание на частичното в DOM, както е обяснено в тази статия.

Брад Уилсън също обсъди това в своята публикация в блог:

Ненатрапчивият клиентски скрипт за валидиране автоматично анализира първоначалния набор от HTML за правила за валидиране, когато страницата приключи със зареждането. Ако вашата страница динамично добавя ново HTML съдържание (може би чрез Ajax или чрез код на приложение от страна на клиента), може да пожелаете да анализирате този нов HTML за проверка на клиента върху новите HTML елементи.

За да анализирате нов HTML, можете да извикате метода jQuery.validator.unobtrusive.parse(), като му предадете селектор за HTML, който искате да бъде анализиран. Можете също така да извикате функцията jQuery.validator.unobtrusive.parseElement(), за да анализирате единичен HTML елемент.

Що се отнася до грешката $ не е дефиниран, трябва да се уверите, че сте включили правилните скриптове:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

Също така се уверете, че не препращате към някой от Microsoft*.js скриптовете. Те са остарели и не трябва повече да се използват в ASP.NET MVC 3.

Разбира се, това е само предположение, не сте показали никакъв код, така че не можем да знаем какво правите.

person Darin Dimitrov    schedule 09.11.2011

Имам същия проблем и открих, че не е възможно да се извика $.validator.unobtrusive.parse() на една и съща форма два пъти. При първоначалното зареждане на формуляра от сървъра формулярът се анализира автоматично от ненатрапчивата библиотека. Когато добавите елемент за въвеждане динамично към формуляра и извикате $.validator.unobtrusive.parse() отново, това няма да работи. Същото важи и за parseElement().

Така че, преди да извикате $.validator.unobtrusive.parse, премахнете оригиналния валидатор и ненатрапчивото валидиране от формуляра по следния начин:

success: function (html) {
                        $("#div-id").append(html);
                        var form = $("#div-id").closest("form");
                        form.removeData('validator');
                        form.removeData('unobtrusiveValidation');
                        $.validator.unobtrusive.parse($("#editorRows"));
                    }
person Zain Ali    schedule 30.01.2013