ASP.NET MVC Jquery验证获胜';如果通过ajax加载了partial,则不会触发
我使用jquery验证选项对部分视图执行客户端验证。部分视图通过ajax加载到使用url的模式对话框中(几乎类似于Html.RenderAction) 但是,当加载部分视图时,验证元数据不会输出到页面。通常您会看到如下情况: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
//<![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();