我正在尝试为动态创建的项目启用不引人注意的javascript验证。 javascript的问题已经在另一个SO问题中解决了,这里不是这种情况。
在这种情况下,项目的动态创建只是克隆在主窗体之外生成的一个空项目。
问题是,如果我在html表单元素之外使用诸如TextBoxFor,CheckBoxFor等的html帮助器,则不会生成进行验证所需的属性(例如data-val-required
)。
我已经检查了MVC源代码,如果FormContext
为null,则有一行返回空属性列表。 (这不会引发异常)
为什么?
最佳答案
您可以手动伪造表单上下文。例如,如果您有一些不包含<form>
元素的局部 View ,并且使用AJAX来调用该局部 View 以重新生成一些输入元素,则可以执行以下操作:
@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
的form元素是不够的。您需要删除与此元素关联的所有先前验证: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');
}
关于asp.net-mvc - ASP.NET MVC非侵入式验证-为什么需要表单上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481552/