ASP.NET MVC Unobtrusive验证 - 为什么需要表单上下文?

kub*_*003 10 asp.net-mvc asp.net-mvc-3

我正在尝试为动态创建的项目启用不显眼的javascript验证.javascript的问题已经在另一个SO问题中解决了,这不是这里的情况.

在这种情况下,动态创建项目只是克隆在主窗体之外生成的一个空项目.

问题是,如果我在html表单元素之外使用像TextBoxFor,CheckBoxFor,...这样的html帮助程序,data-val-required则不会生成验证工作所需的属性(例如.).

我已经检查了MVC源代码,如果FormContext为null ,则返回空属性列表.(这没有例外)

为什么?

Dar*_*rov 20

您可以手动伪造表单上下文.例如,如果你有一些不包含<form>元素的部分视图,并且使用AJAX调用它来重新生成一些输入元素,你可以这样做:

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

@Html.LabelFor(x => x.Foo)
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
Run Code Online (Sandbox Code Playgroud)

相应的输入元素现在将拥有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');   
}
Run Code Online (Sandbox Code Playgroud)