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

时间:2012-02-28 12:03:07

标签: asp.net-mvc asp.net-mvc-3

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

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

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

我已经检查了MVC源代码,如果FormContext为空,则会返回一个返回空属性列表的行。 (这没有例外)

为什么?

1 个答案:

答案 0 :(得分:20)

您可以手动伪造表单上下文。例如,如果你有一些不包含<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');   
}