ASP.NET MVC Ненавязчивая проверка - зачем нужен контекст формы? - PullRequest
10 голосов
/ 28 февраля 2012

Я пытаюсь включить ненавязчивую проверку JavaScript для динамически создаваемых элементов. Проблема с javascript уже была решена в другом вопросе SO, а здесь это не так.

Динамическое создание элементов в этом случае - это просто клонирование одного пустого элемента, созданного вне основной формы.

Проблема в том, что если я использую html-помощники, такие как TextBoxFor, CheckBoxFor, ... вне элемента html-формы, то атрибуты, необходимые для работы проверки (например, data-val-required), не генерируются.

Я уже проверил исходный код MVC, и есть строка, которая возвращает пустой список атрибутов, если FormContext равно нулю. (это не исключение)

Почему?

1 Ответ

20 голосов
/ 28 февраля 2012

Вы можете вручную подделать контекст формы. Например, если у вас есть частичное представление, которое не содержит элемент <form> и которое вызывается с использованием AJAX для регенерации некоторых элементов ввода, вы можете сделать это:

@model MyViewModel
@{
    ViewContext.FormContext = new FormContext();
}

@Html.LabelFor(x => x.Foo)
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)

Соответствующие элементы ввода теперь будут иметь атрибуты data-*. Но этого может быть недостаточно. Если вы только обновляете (используя AJAX) только часть <form>, но не заменяете элемент формы в DOM, вызывая $.validator.unobtrusive.parse, будет недостаточно. Вам необходимо удалить все предыдущие проверки, связанные с этим элементом:

success: function(result) {
    // we are replacing only a portion of the form
    $('#somePartOfTheForm').html(result);

    $('form').removeData('validator');
    $('form').removeData('unobtrusiveValidation');
    $.validator.unobtrusive.parse('form');   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...