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

动态局部视图+;jquery表单劫持&x2B;客户端验证=不工作,jquery,asp.net-mvc,validation,dynamic,partial-views,Jquery,Asp.net Mvc,Validation,Dynamic,Partial Views,我正在使用MVC3和不引人注目的javascript进行客户端验证 我有一个表,表中的行可以单击。单击时,我想显示动态加载的局部视图。这是用于此的代码: function GetStuff(id) { $.ajax( { url: "Edit/" + id, success: function (result) { $("#DivTest").html(result); } }); } 到目前为止,

我正在使用MVC3和不引人注目的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()){
    ...
}
但每次都会返回真值

从这篇文章中我得到了两条建议

添加

Sys.Mvc.FormContext._Application_Load(); 
在加载分部文件后。。 并将post的数据类型设置为“html”。两者都不起作用

我也尝试过这种方法,但运气不佳:

这种技术的结合是很常见的,我想,为什么这么难让它工作呢?非常感谢您的帮助。
谢谢

你为什么要劫持部分表单?我认为,因为你劫持了表单,不引人注目的现场事件没有被触发,这就是你没有得到验证错误的原因

您是否尝试过使用Ajax表单<代码>(Ajax.BeginForm(…)


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

好的,我终于得到了它。问题就在这里,不管我是使用了jack表单还是使用了Ajax.BeginForm(…),都没有区别。如果我没有动态加载部分,它总是有效的

解决方案?

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

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

// insert new form into the DOM first, then call:
$.validator.unobtrusive.parse('<form selector>'));
$('<form selector>').validate(); // start validating
//首先将新表单插入DOM,然后调用:
$.validator.unobtrusive.parse(“”);
$('').validate();//开始验证
这将根据表单子元素中的dataxxx属性设置jquery.validation验证器


在此之后,调用
$('').validate().form()
应按预期工作

我读过几篇文章,建议不要使用任何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函数(数据、textStatus、jqXHR)?请参阅:。如果代码仍然不起作用,您能否发布代码。它只是完成(内容){alert(“test”)}的函数而已但它从未被调用。我在没有参数的情况下进行了测试,并使用您建议的方法进行了测试。没有调用任何事件:(页面被发布,页面被替换为我的Json结果字符串。这非常有效。我想这比我刚提出的解决方案(在部分视图中添加js文件)要好)。将另一个人的答案标记为正确比我自己的答案感觉好得多:)tnx,从技术上讲,这就是不引人注目的验证脚本在$(document).ready()处理程序中注册的内容。因此,我的解决方案和您的解决方案执行相同的代码:)这也回答了我遇到的一个问题。然而,验证新表单(每个字段都失败,因为它是空的)并不是最优的。知道它为什么这样做/如何阻止它吗?