ненав’язлива перевірка не працює з динамічним вмістом


96

У мене проблеми, намагаючись змусити ненав’язливу перевірку jquery працювати з частковим видом, який динамічно завантажується через виклик AJAX.

Я цілими днями намагався змусити цей код працювати без удачі.

Ось вигляд:

@model MvcApplication2.Models.test

@using (Html.BeginForm())
{
 @Html.ValidationSummary(true);
 <div id="res"></div>
 <input id="submit" type="submit" value="submit" />
}

Частковий вигляд:

@model MvcApplication2.Models.test

@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);

<script type="text/javascript" >
  $.validator.unobtrusive.parse(document);
</script>

Модель:

  public class test
  {
    [Required(ErrorMessage= "required field")]
    public int MyProperty { get; set; }
  }

Контролер:

    public ActionResult GetView()
    {
        return PartialView("Test");
    }

і нарешті, 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;
    }
});

Перевірка не працює. Навіть якщо я не заповнюю жодної інформації в текстовому полі, подія подання відображає попередження ("дійсне").

Однак, якщо замість динамічного завантаження подання я використовую @Html.Partial("test", Model)для часткового перегляду в основному поданні (і я не роблю виклику AJAX), тоді перевірка працює чудово.

Це, мабуть, тому, що якщо я завантажую вміст динамічно, елементи керування ще не існують у DOM. Але я роблю виклик, $.validator.unobtrusive.parse($("#res")); якого повинно бути достатньо, щоб повідомити валідатор про нещодавно завантажені елементи керування ...

Хтось може допомогти?


У мене також була та сама проблема, але в mvc 2. Я проходжу крок за кроком як: weblogs.asp.net/imranbaloch/archive/2010/07/11/... Це також може вам допомогти. weblogs.asp.net/imranbaloch/archive/2011/03/05/… Сподіваюся, що це допоможе :)
Нареш Пармар

2
Зверніть увагу, що unobtrusive.parseфункція приймає селектор як аргумент, а не елемент.
Фред

Відповіді:


226

Якщо ви спробуєте проаналізувати вже проаналізовану форму, вона не оновиться

Що ви можете зробити, додавши динамічний елемент у форму, будь-яким

  1. Ви можете видалити перевірку форми та перевірити її наступним чином:

    var form = $(formSelector)
        .removeData("validator") /* added by the raw jquery.validate plugin */
        .removeData("unobtrusiveValidation");  /* added by the jquery unobtrusive plugin*/
    
    $.validator.unobtrusive.parse(form);
  2. Доступ до unobtrusiveValidationданих форми за допомогою dataметоду jquery :

    $(form).data('unobtrusiveValidation')

    потім отримати доступ до колекції правил та додати нові атрибути елементів (що дещо ускладнено).

Ви також можете ознайомитися з цією статтею про Застосування ненав’язливої ​​перевірки jquery до динамічного вмісту в ASP.Net MVC для плагіна, що використовується для додавання динамічних елементів у форму. Цей плагін використовує друге рішення.


17
Чувак ти рок, повністю врятував мій день! Чудова відповідь!
Димитър Димитров

Я боявся, що повинен запросити сам. Сценарій із цієї сторінки працює як шарм.
cezarypiatek

Код, чудово працює - швидке оновлення (якщо можу) 1. Я використовую нокаут і отримую назви полів, здається, це проблема. $ .validator.unobtrusive.parseDynamicContent ('форма'); (щоб отримати всі поля), наприкінці під час подання. 2. Це приємно johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/..., щоб дати вам спосіб називати поля (що, здається, потрібно? Я використовую ненав’язливий завантажувальний файл jquery поверх інших 2, тому мій обставини, ймовірно, різні)
Річард Хошем

Просто зауважте, що будь-які налаштування, до яких ви застосували форму, $("form").data("validator").settingsбудуть видалені $(formSelector).removeData("validator")та замінені на значення за замовчуванням $.validator.defaultsпри перепрофілюванні форми. Це чудовий спосіб включити динамічні поля, але обов’язково повторіть будь-який власний код ініціалізації на кожному новому розборі.
KyleMit

19

Як доповнення до відповіді Надім Хедр ....

Якщо ви динамічно завантажили форму у свій DOM, а потім зателефонуйте

jQuery.validator.unobtrusive.parse(form); 

(із зазначеними додатковими бітами), а потім збираються подати цю форму, використовуючи ajax не забудьте зателефонувати

$(form).valid()

який повертає true або false (і запускає фактичну перевірку) перед тим, як подати форму.


привіт, я стикаюся з тим же питанням. я показую мій динамічний вигляд у спливаючому вікні (діалогове вікно jquery). безперешкодні перевірки не працюють. де я можу зателефонувати $ (form) .valid () у своєму динамічному перегляді чи десь ще?
mmssaann

Я завжди перешкоджав подачі форми, повертаючи помилку всередину $ (form) .submit, оскільки я робив подання AJAX, але тоді мені потрібен був спосіб не викликати подання AJAX, коли перевірка не вдалася. $ (form) .valid () - відповідь! Дякую!
jgerman

6

додайте це до вашого _Layout.cshtml

 $(function () {
        //parsing the unobtrusive attributes when we get content via ajax
        $(document).ajaxComplete(function () {
            $.validator.unobtrusive.parse(document);
        });
    });

3
Це особливо неефективно.
Ліам,

5

Дивно, але коли я переглянув це запитання, офіційні документи ASP.NET все ще не мали жодної інформації про ненав’язливий parse()метод або як використовувати його з динамічним вмістом. Я дозволив собі створити проблему в репозиторії документів (з посиланням на оригінальну відповідь @ Nadeem) і надіслати запит на виправлення, щоб виправити це. Ця інформація тепер відображається в розділі перевірки на стороні клієнта в темі перевірки моделі.


3

перевірити це:

if ($.validator.unobtrusive != undefined) {
    $.validator.unobtrusive.parse("form");
}

2

Мене вразила та сама проблема, і нічого не працювало, крім цього:

$(document).ready(function () { 
    rebindvalidators();
});

function rebindvalidators() {
    var $form = $("#id-of-form");
    $form.unbind();
    $form.data("validator", null);
    $.validator.unobtrusive.parse($form);
    $form.validate($form.data("unobtrusiveValidation").options);
}

і додати

// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
    return;

де ви намагаєтеся зберегти форму.

Я зберігав форму за допомогою дзвінка Ajax.

Сподіваюся, що це комусь допоможе.


1
Цей мені працював. Я знаходив рішення за останні багато днів, воно працює в asp.net core 2. Дякую.
Прадіп Рупарелія

0

просто скопіюйте цей код ще раз в кінці модального коду

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.