注入Ajax内容的MVC2客户端验证

Rad*_*ila 5 validation ajax client-side asp.net-mvc-2

我正在进行Ajax调用并将内容添加到MVC2应用程序内的表单中.我需要通过验证我的新内容来更新客户端验证元数据.

 <script type="text/javascript"> 
//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({"Fields":[{"
...
</script>
Run Code Online (Sandbox Code Playgroud)

有没有办法为局部视图生成此元数据?

提前致谢.

小智 6

我也在这上面撞墙几天,并且要沿着移除表格标签的路线走下去,但是如果你仍然感兴趣,那就让它以一种稍微不那么笨拙的方式工作.我的场景类似,因为我有一个表单,其中包含最初要验证的元素集合,但用户可以通过ajax动态添加新行.

我会把它分解,所以希望看到发生的事情会更容易.查看MVC源代码,表单和验证大致如下:

Html.BeginForm()输出开始表单标签,然后创建并返回一个新的MvcForm实例,除了使表单的范围更容易为您管理外,它不会向外做很多事情.但它会创建一个新的FormContext并将其存储在ViewContext.FormContext中.正是这个FormContext跟踪客户端验证.

Html.BeginForm()做的最后一件事是使用form标签的id设置新FormContext的FormId属性.这是必需的,因此客户端脚本可以匹配表单和验证规则.

Html.EndForm()配置MvcForm.此Dispose方法输出表单结束标记,然后调用ViewContext.OutputClientValidation(),它可用于输出javascript.最后,它删除当前的FormContext并将其设置回父FormContext,如果没有,则返回null.

因此,为了不输出表单标记,我们需要从MvcForm构造函数/析构函数中获取一些FormContext管理.

因此,在我的部分视图中,我执行了以下操作:

在顶部,我检查ViewContext.FormContext是否有值.如果是这样,我们处于初始负载,所以不需要乱七八糟.如果没有,它是一个ajax调用,所以我启用客户端验证,直接创建一个新的MvcForm(使用BeginForm) - 这会导致创建一个FormContext - 并将FormContext.FormId设置为与我的父页面相同

在视图的最后,我检查是否有表单实例,如果有,请调用ViewContext.OutputClientValidation()并将ViewContext.FormContext重置为null.我没有Dispose()MvcForm,因为这将输出结束标记,而MvcForm不包含一次性对象.

视图的骨架看起来如此:

<%
MvcForm dummyForm = null;
if (this.ViewContext.FormContext == null)
{
    Html.EnableClientValidation();
    dummyForm = new MvcForm(this.ViewContext);
    this.ViewContext.FormContext.FormId = "mainform";
}
%>

// standard partial view markup goes here

<%
if (dummyForm != null)
{
    this.ViewContext.OutputClientValidation();
    this.ViewContext.FormContext = null;
}
%>
Run Code Online (Sandbox Code Playgroud)

你可以很容易地把它包装成一个扩展方法

菲尔


Rad*_*ila 2

终于开始工作了。

答案很简单:不要浪费时间使用 MicrosoftMvcValidation.js。它是用 Script# 生成的,这使得扩展变得困难。

切换到xValjQuery Validation。它不需要表单来生成客户端验证元数据。另外,为了加载 AJAX 请求的验证,您所要做的就是在获得新的 Html 后调用以下命令:

lForm.find("#placeholder").empty();                     
lForm.valid();
lForm.find("#placeholder").html(responseHtml);   
Run Code Online (Sandbox Code Playgroud)

就可以了。首先,删除旧内容。然后重新运行验证以消除可能过时的验证错误。然后添加新内容。工作起来就像一个cham。

此外,jQuery 验证可以非常轻松地启用或禁用特定字段的验证(条件验证)。