ASP.NET MVC Jquery验证获胜';如果通过ajax加载了partial,则不会触发

ASP.NET MVC Jquery验证获胜';如果通过ajax加载了partial,则不会触发,jquery,asp.net-mvc-2,Jquery,Asp.net Mvc 2,我使用jquery验证选项对部分视图执行客户端验证。部分视图通过ajax加载到使用url的模式对话框中(几乎类似于Html.RenderAction) 但是,当加载部分视图时,验证元数据不会输出到页面。通常您会看到如下情况: //<![CDATA[ 3if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; } 4window.mvcClientValidationMetadata

我使用jquery验证选项对部分视图执行客户端验证。部分视图通过ajax加载到使用url的模式对话框中(几乎类似于Html.RenderAction)

但是,当加载部分视图时,验证元数据不会输出到页面。通常您会看到如下情况:

//<![CDATA[
3if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
4window.mvcClientValidationMetadata.push({"Fields":[],"FormId":"form0","ReplaceValidationSummary":false});
5//]]> 
//

我的问题与此非常相似,但我不想使用Microsoft验证,因为我熟悉jQuery.validate。

请查看此链接:

它包含假设在动态加载(通过AJAX)的部分视图上执行javascript的修复程序。

您对问题的理解是,在页面的部分更新中,相应的DOM元素被重新插入,即它们是新的,并且没有所需的$.validate初始化

我想您可以使用$.live/$.livequery将$.validate对象绑定到这些字段,这样在每次部分页面更新之后,jquery代码都会重新初始化这些字段的$.validate。可能您可以使用css类来标记这些DOM元素

我建议的是后期绑定,并使用与DOM插入相关的较新事件


希望这有帮助

当我将内容以友好方式放入DOM时,在加载javascript时也遇到过类似的问题。如何将内容插入DOM? jQuery中有一些方法在插入时去掉javascript,请尝试使用以下方法:

$("#mydiv").html(newContent);

希望这对你有帮助

如果我正确理解了你的问题,这可能会有所帮助

在下面的示例中,我使用Ajax.BeginForm来更新div(id=“div\u to\u update”),但也可以是其他方法

重要的是下面启动方法的成功。这将更新div内容并执行所有Javascript,包括jquery验证。最初,我在Telerik论坛上找到了这个解决方案

<div id="div_to_update">
<% using (Ajax.BeginForm("Translations", new { Model.Id }, new AjaxOptions { OnSuccess = "updatePlaceholder", UpdateTargetId = "div_to_update", InsertionMode = InsertionMode.Replace }, new { id = "translationAjaxForm" }))
<% } %>

<script type="text/javascript">
    function updatePlaceholder(context) {
        // the HTML output of the partial view
        var html = context.get_data();

        // the DOM element representing the placeholder
        var placeholder = context.get_updateTarget();

        // use jQuery to update the placeholder. It will execute any JavaScript statements
        $(placeholder).html(html);

        // return false to prevent the automatic update of the placeholder
        return false;
    }
</script>
</div>


也许我有点困惑,但你能在提交时调用验证,如果失败就不提交吗

$(function() {
    $("form:first").validate( { .. options for validator .. });

    $("submit").click(function() {
        if(!$("form:first").valid()){ 
             return false;
        }
        // Submit form here
    });

});

我也有同样的问题,我就是这样解决的

打开MicrosoftMvcJQueryValidation.js并进行以下更改

添加此功能

function __MVC_ApplyClientValidationMetadata() {
   var allFormOptions = window.mvcClientValidationMetadata;
   if (allFormOptions) {
      while (allFormOptions.length > 0) {
         var thisFormOptions = allFormOptions.pop();
         __MVC_EnableClientValidation(thisFormOptions);
       }
   }
}
找到$(document).ready()并将其替换为

$(document).ready(__MVC_ApplyClientValidationMetadata); 
现在只需执行以下操作

如果您使用html(),那么在将html加载到元素中后,只需调用_MVC_ApplyClientValidationMetadata即可

$("#someDiv").html(responseHtml);
__MVC_ApplyClientValidationMetadata();
如果使用load(),则会出现另一个问题。它将删除所有脚本标记。所以你必须做如下的事情

$("#someDiv").load("/a/partialview/request" , function(response){
   var scripts = $(response).filter("script");
   for (var i = 0; i < scripts.length; i++) {
      //executes javascript
      $.globalEval(scripts[i].text);
   }
   __MVC_ApplyClientValidationMetadata();
});
$(“#someDiv”).load(“/a/partialview/request”,函数(响应){
变量脚本=$(响应).filter(“脚本”);
对于(var i=0;i

还有一件事。确保使用ajax加载的表单具有唯一的id。默认情况下,所有表单的id均为form0。

部分问题在于响应中包含的脚本未执行。在我的例子中,我必须使用基于jcruz解决方案的解决方案,该解决方案从特定的ajax表单中选择脚本:

var scripts = $('div#id_of_ajax_form>script');
for (var i = 0; i < scripts.length; i++) {
    //executes javascript
    $.globalEval(scripts[i].text);
}

希望这有帮助。任何评论都将不胜感激。

问题似乎是MVC Jquery验证会在页面加载时启动以设置验证,但在通过AJAX插入新的DOM元素后不会再次启动。比我聪明的人将需要破解MVC的股票MVC jquery验证文件,并将其添加到中。可能是因为部分视图包含javascript,需要首先对其进行评估,否则它不会执行。。您是否评估您的ajax响应?通常的MVC ajax工具使用.innerHTML=来设置内容。浏览器将不会执行该脚本。如上所述使用jQuery.html()时,jQuery代码将查看内容中是否有脚本并执行它们。
Sys.Mvc.FormContext._Application_Load();