ASP.NET MVC Ненавязчивая проверка - зачем нужен контекст формы?

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

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

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

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

Почему?

Ответ 1

Вы можете вручную подделать контекст формы. Например, если у вас было частичное представление, которое не содержит элемент <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');   
}