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

时间:2011-02-11 11:41:21

标签: jquery asp.net-mvc validation dynamic partial-views

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

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

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

这一切都有效。 问题是当我尝试使用jquery在partial中保存某些东西时。表格被劫持,如下:

$(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

这种技术组合是非常常见的,我想,为什么它很难让它起作用?任何帮助都非常感谢。 谢谢

3 个答案:

答案 0 :(得分:13)

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

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

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

之后,呼叫$('<form selector>').validate().form()应按预期工作!

答案 1 :(得分:1)

你为什么试图劫持部分形式?我认为因为你劫持不引人注目的现场活动的形式没有解雇,这就是为什么你没有得到验证错误。

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

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

答案 2 :(得分:0)

好吧我终于得到了它。问题出在那里,不管我是否喜欢表格或者我使用的是Ajax.BeginForm(...),没有区别。如果我没有动态加载部分,它总是有效。

解决方案?

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