0

我在 Visual Studio 10 中使用 MVC 3 和 razor 以及客户端不显眼的验证。我需要为用户提供保存表单的机会,因为缺少一些必填字段。提交具有 Ajax.bgein 表单结构。

我有以下 JavaScript 来捕获提交事件。

$(document).ready(function () {

$('#submit-11').click(function (event) {

    var validator = $("#form0").validate();

    if (!$("#form0").valid()) {
        // for partial save needs either ID number
        // or family name and date of birth
        var NameExists = true;
        var DateOfBirthExists = true;
        var IDNumberExists = true;

        if (validator.errorMap["model.FamilyName"]) { NameExists = false; }
        if (validator.errorMap["model.DateOfBirth"]) { DateOfBirthExists = false; }
        if (validator.errorMap["model.IDNumber"]) { IDNumberExists = false; }

        if (IDNumberExists || (NameExists && DateOfBirthExists)) {
            if ($("#model_PartialSave").attr('checked')) {
                //  partial save has been requested
                alert("saving");
                return true;    // AJAX save is NOT triggered
            }
            $("#AgreePartialSave").show();
            $("#model_PartialSave").removeAttr('checked');

        }
        return false;
    }
    return true;    // AJAX save IS triggered
});

});                    //document ready end

逻辑似乎是正确的 - 我已经在 firebug 中跟踪了这一点 - 并且触发了警报,但 AJAX 提交调用没有发生。如果表单有效,则会发生 AJAX 提交调用。

我也尝试过event.preventDefault(); ,但这会阻止任何保存的发生。

我也在萤火虫中追踪了这一点,似乎所有正确的调用都在进行。

感激地收到任何帮助。

更新

似乎这可能是 Microsoft Ajax 库中的一个限制。有关详细信息和解决方法,请参阅此链接。

4

1 回答 1

0

我相信你需要拦截的是表单的提交事件,而不是提交按钮的点击事件。发生的事情(我怀疑)是,由于验证框架仍然认为您的表单无效,因此即使您让 click 事件通过您的return true.

这里有一个在验证完成后但在实际发布之前运行 javascript 的示例。

$(function() { 
    $('#form0').submit(function() { 
        if (!$(this).valid()) { 
            // do your thing
            return true; 
        } 
    }); 
 }); 

ETA:阅读您的回复后,我想知道问题是否不在于验证框架认为您的页面无效,而您正试图覆盖其结论并提交。在那种情况下,我提供的代码永远不会执行,因为提交永远不会发生。

我建议尝试这样做:从模型中对应于 3 个输入字段的属性中删除所需的属性,并将您的检查逻辑移动到submit函数中,正如我所建议的那样。但与其说if(!$(this).valid()),,你只会在表单有效的情况下执行代码。

于 2012-10-15T17:39:15.753 回答