动态局部视图 + jquery 表单劫持 + 客户端验证 = 不工作

Posted

技术标签:

【中文标题】动态局部视图 + jquery 表单劫持 + 客户端验证 = 不工作【英文标题】:Dynamic partial view + jquery form hijack + client validation = not working 【发布时间】:2011-06-25 12:15:40 【问题描述】:

我使用 MVC 3 和不显眼的 javascript 进行客户端验证。

我有一个表格,其中包含可点击的行。单击时,我想调出动态加载的局部视图。这是这个的代码:

function GetStuff(id) 
    $.ajax(
    
        url: "Edit/" + id,
        success: function (result) 
            $("#DivTest").html(result);
        
    );

到目前为止一切正常。 问题是当我尝试使用 jquery 在部分中保存某些内容时。表单被劫持,如下所示:

$(function () 
    $.post($(this).attr("action"),
        $(this).serialize(),
        function (data) 
            alert("test");
        );
    e.preventDefault();
);

所有这些都使客户端验证不起作用。即使我遗漏了一些必需的值,它也会发布。如果我不使用 ajax 发布或者在页面加载时加载部分内容(非动态),这一切都有效。


我尝试过的:

我试着把这个放在帖子之前:

if($('form').validate().form())
    ...

这只是每次都返回 true..

从这篇文章中我得到了 2 条建议 ASP.NET MVC 2 loading partial view using jQuery - no client side validation

添加

Sys.Mvc.FormContext._Application_Load(); 

部分加载后.. 并将帖子的数据类型设置为“html”。都没有用。

我也尝试过这种方法,但没有成功: http://www.deepcode.co.uk/2010/08/mvc-ootb-validation-when-pulling-in.html

我猜这种技术组合很常见,为什么很难让它发挥作用?非常感谢任何帮助。 谢谢

【问题讨论】:

【参考方案1】:

在新表单成功加载 ajax 后,您必须指示不显眼的验证库通过手动调用来解析新表单:

// insert new form into the DOM first, then call:
$.validator.unobtrusive.parse('<form selector>'));
$('<form selector>').validate(); // start validating

这会根据表单子元素中的 data-xxx 属性设置 jquery.validation 验证器。

之后,调用 $('&lt;form selector&gt;').validate().form() 应该会按预期工作!

【讨论】:

这很好用。我想这比我刚刚提出的解决方案(在局部视图中添加 js 文件)要好。将其他人的答案标记为正确也比我自己的感觉好得多:) tnx,从技术上讲,这就是不显眼的验证脚本在 $(document).ready() 处理程序中注册的内容。所以我的解决方案和你的解决方案执行相同的代码:) 这也回答了我遇到的一个问题。但是,它正在验证新表单(并且在每个字段上都失败,因为它是空的),这不是最佳的。任何想法为什么这样做/如何阻止它?【参考方案2】:

你为什么要劫持部分表单?我认为因为你劫持了不显眼的实时事件没有触发表单,这就是你没有收到验证错误的原因。

您是否尝试过使用 Ajax 表单? (Ajax.BeginForm(...))

如果您引入部分 ajax 表单,它应该包含验证所需的所有信息。提交表单后,您可以指定要运行的 javascript 函数。

【讨论】:

我已经阅读了几篇文章,建议不要使用任何 MS ajax 方法,而是使用 jquery,特别是如果其他所有操作都使用 jquery 完成。我尝试了这个,但事件没有触发(比如“OnBegin”和“OnSuccess”。而是发布页面返回其自身的部分视图。 在 MVC 3 中,ajax 已更改为使用 jquery,并且 IMO 得到了极大的改进。发布到操作后,您如何返回结果?您要返回 Json 结果吗?如果没有尝试。这样你就可以在你的 jquery onsuccess 中解析 json 并确定要做什么。 我正在返回一个 PartialView(model) 但我不介意返回 json 并解析结果。我现在尝试了这个,但无论如何都没有调用该事件,所以我无法处理结果。我在 BeginForm 中设置了这些参数:OnBegin、OnSuccess、OnComplete、OnFailure、HttpMethod = "post"。但没有一个事件有效。 你的javascript函数是什么样的?例如OnSuccess 是否与 jquery ajax 签名匹配,所以它看起来像函数 OnSuccess(data, textStatus, jqXHR)?见:api.jquery.com/jQuery.ajax。如果仍然无法正常工作,您可以发布您的代码吗? 它只是函数 OnComplete(content) alert("test") 但它永远不会被调用。我在没有参数和你建议的情况下进行了测试。没有事件被调用 :( 页面被发布,页面被我的 Json 结果字符串替换。【参考方案3】:

好吧,我终于明白了。问题就在那里,无论我是使用表单还是使用 Ajax.BeginForm(...),都没有区别。如果我没有动态加载部分,它总是有效的。

解决方案?

将 jquery.validate.unobtrusive.min.js 添加到 partial 视图中。 这可能是一个新手错误,仅将其添加到父视图或母版页,但如果这对某人有帮助,我很乐意承认我的这个错误:) 正是这个 js 文件使客户端验证工作,当然每次加载部分(其中包含客户端验证)时都必须调用它。

【讨论】:

以上是关于动态局部视图 + jquery 表单劫持 + 客户端验证 = 不工作的主要内容,如果未能解决你的问题,请参考以下文章

动态添加部分视图后如何重新初始化JQuery

怎么用jquery 动态刷新session

jQuery/PHP 动态表单提交

Wordpress 是不是在劫持我的 Ajax 表单帖子?

jQuery,MVC3:在模式对话框中提交部分视图表单

ASP.NET MVC 2 使用 jQuery 加载部分视图 - 无客户端验证