对于使用AJAX提取的部分视图,不会生成客户端验证脚本

时间:2010-12-21 16:45:58

标签: asp.net-mvc asp.net-mvc-2-validation

我正在尝试使用MicrosoftMvcJQueryValidation设置客户端验证 使用ajax提交的表单。 如果直接从视图渲染局部视图,它的工作完全正常。 但是,当我尝试通过XHR获取它时,例如在JQuery对话框中显示它, 客户端验证不为输出html生成javascript。 有什么想法吗?

工作代码 - 使用Html.RenderPartial呈现部分视图:

查看:

<%@ Page Title="" Language="C#"  Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
 <% Html.RenderPartial("New"); %>
</asp:Content>

部分视图:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Product>" %>
<% Html.EnableClientValidation();%> 
<% Html.BeginForm();%>
  <%= Html.EditField(m => m.price)%>
  <%= Html.ValidationMessageFor(m => m.price)%>
<% Html.EndForm();%>

不工作代码 - 使用JQuery load()函数获取部分视图。

查看:

<%@ Page Title="" Language="C#"  Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

 ....

 $("#dialog").load('~/Product/New/');
 $("#dialog").dialog("open");

 ....

 <div id="dialog" title=""></div>
</asp:Content>

相关控制器操作:

public PartialViewResult New(int id)
{
  return PartialView(service.GetProduct());
}

感谢。

2 个答案:

答案 0 :(得分:2)

对于所有返回通过AJAX插入DOM的JavaScript的部分视图,都会发生这种情况。问题是当部分视图插入到文档中时,不会执行/解释返回的部分视图。

不幸的是,因为您正在处理的是生成的JavaScript,我可以解释您遇到问题的原因,但我对解决方案感到茫然。如果这是您编写的函数,我建议将其添加到OnComplete中。我可以提供的是,这是一个JavaScript限制,并开始寻找那里。

BTW:这看起来很有希望http://adammcraventech.wordpress.com/2010/06/11/asp-net-mvc2-ajax-executing-dynamically-loaded-javascript/

答案 1 :(得分:0)

阅读ARM提到的博客后,解决方案似乎真正依赖  关于如何加载局部视图。  最终对我有用的是调用__MVC_EnableClientValidation  视图分配给元素后:

    $.get('~/Product/New/', function(data) {
        $("#dialog").html(data);

        // extracted from MicrosoftMvcJQueryValidation.js
        var allFormOptions = window.mvcClientValidationMetadata;
        if (allFormOptions) {
            while (allFormOptions.length > 0) {
                var thisFormOptions = allFormOptions.pop();
                __MVC_EnableClientValidation(thisFormOptions);
            }
        }
    },'html');