asp.net-mvc - ASP.NET MVC非侵入式验证-为什么需要表单上下文?

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

我正在尝试为动态创建的项目启用不引人注意的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/

相关文章:

c# - 返回一个字符串列表作为 JSONResult

c# - Controller 返回与 View 不匹配的值?

html - 在 Html.Textbox 上设置必需的属性

vb.net - 为什么 <ScaffoldColumn(False)> 不起作用?

c# - NHibernate 异常 : Transaction not connected, 或已断开连接

asp.net-mvc - asp.net mvc 从搜索引擎抓取中排除一个 Action

asp.net-mvc - '以另一个用户身份登录' MVC 4 Windows 身份验证

c# - 是否可以部分部署到 ASP.Net MVC?

json - 为什么更新操作没有发布任何数据?

jquery - 从客户端检测到潜在危险的 Request.Path 值