MVC Ajax.beginform部分验证逻辑不一致

时间:2012-10-15 12:24:40

标签: javascript jquery asp.net-mvc unobtrusive-validation

我在Visual Studio 10中使用MVC 3和razor,客户端不引人注意的验证。我要求为用户提供保存表单的机会fs缺少一些必填字段。提交是使用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库中的限制。 See this link了解详情和解决方法。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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