代码之家  ›  专栏  ›  技术社区  ›  Grizzly

jQuery验证SubmitHandler,不命中Ajax提交

  •  -1
  • Grizzly  · 技术社区  · 6 年前

    @section scripts{
        @Scripts.Render("~/bundles/jqueryval")
    
        <script>
            $(document).ready(function() {
    
                // Mask
                $("#Teu_Rate").mask("####.##", { reverse: true });
                $("#Mcsap_Rate").mask("####.##", { reverse: true });
    
                // Submission
                var redirectUrl = '@Url.Action("Index", "tblPersonnels")';
                var settings = {};
                settings.baseUri = '@Request.ApplicationPath';
                var infoGetUrl = "";
                if (settings.baseUri === "/Scalehouse") {
                    infoGetUrl = settings.baseUri + "/tblPersonnels/Create/";
                } else {
                    infoGetUrl = settings.baseUri + "tblPersonnels/Create/";
                }
    
                // ajax portion
                $("form").validate({
                    submitHandler: function(form) {
                        $.ajax({
                            url: infoGetUrl,
                            method: "POST",
                            data: $("form").serialize(),
                            beforeSend: disableCreateBtn(),
                            success: function() {
                                console.log("success");
                                toastr.options = {
                                    positionClass: "toast-top-full-width",
                                    onHidden: function() {
                                        window.location.href = redirectUrl;
                                    },
                                    timeOut: 3000
                                }
                                toastr.success("Personnel successfully created")
                            },
                            error: function(jqXHR, textStatus, errorThrown) {
                                toastr.options = {
                                    positionClass: "toast-top-full-width",
                                    onHidden: function() {
                                        enableCreateBtn();
                                    },
                                    timeOut: 3000
                                }
                                var status = capitalizeFirstLetter(textStatus);
                                var error = $.parseJSON(jqXHR.responseText);
                                console.log(error);
                            }
                        })
                    }
                });
    
                function capitalizeFirstLetter(string) {
                    return string.charAt(0).toUpperCase() + string.slice(1);
                }
    
                function disableCreateBtn() {
                    $('#Personnel-Create-Btn').prop('disabled', true);
                }
    
                function enableCreateBtn() {
                    $('#Personnel-Create-Btn').prop('disabled', false);
                }
            });
        </script>
    }
    

    当请求成功完成时,我应该在控制台中收到一条消息和一个toastr通知,但是我没有收到任何消息,也没有收到任何控制台错误,但是我输入的记录被成功输入,这意味着表单是通过常规MVC约定提交的。

    更新

    在用Sparky在下面发表评论之后,我将代码更改为:

    $("form").submit(function (t) {
    
        t.preventDefault();
    
            $.ajax({
                url: infoGetUrl,
                method: "POST",
                data: $("form").serialize(),
                beforeSend: disableCreateBtn(),
                success: function() {
                    console.log("success");
                    toastr.options = {
                        positionClass: "toast-top-full-width",
                        onHidden: function() {
                            window.location.href = redirectUrl;
                        },
                        timeOut: 3000
                    }
                    toastr.success("Personnel successfully created");
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    toastr.options = {
                        positionClass: "toast-top-full-width",
                        onHidden: function() {
                            enableCreateBtn();
                        },
                        timeOut: 3000
                    }
                    var status = capitalizeFirstLetter(textStatus);
                    //var error = $.parseJSON(jqXHR.responseText);
                    console.log(jqXHR);
                }
            });
    
        });
    

    现在,如果窗体为空。。我按了创建按钮。。不知何故,ajax进入了success函数,同时在某些必填字段上给了我验证错误。。然后重定向到另一个页面,就好像请求成功一样。。有什么想法吗?

    更新2

    我使用以下语法使它工作:

    $("form").data("validator").settings.submitHandler =
        function(form) {
            $.ajax({
                url: infoGetUrl,
                method: "POST",
                data: $("form").serialize(),
                beforeSend: disableCreateBtn(),
                success: function () {
                    console.log("success");
                    toastr.options = {
                        positionClass: "toast-top-full-width",
                        onHidden: function () {
                            window.location.href = redirectUrl;
                        },
                        timeOut: 3000
                    }
                    toastr.success("Personnel successfully created.");
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    console.log(jqXHR);
                    toastr.options = {
                        positionClass: "toast-top-full-width",
                        onHidden: function () {
                            enableCreateBtn();
                        },
                        timeOut: 3000
                    }
                    var status = capitalizeFirstLetter(textStatus);
                    var error = $.parseJSON(jqXHR.responseText);
                    console.log(error);
    
                    var modelState = error.modelState;
                    //console.log(modelState);
                    $.each(modelState,
                        function (key, value) {
                            var id = "";
                            if (key === "$id") {
                                id = "#" + key.replace('$', '').substr(0, 1).toUpperCase() + key.substr(2);
                            } else {
                                //console.log(key);
                                var status = capitalizeFirstLetter(textStatus);
                                toastr.error(status + " - " + modelState[key]);
                            }
                            var input = $(id);
                            //console.log(id); // result is #id
                            if (input) { // if element exists
                                console.log(id);
                                input.addClass('input-validation-error');
                            }
                        });
                }
            });
        }
    

    我不知道为什么,但它正在起作用。。我很想知道为什么

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sparky    6 年前

    我让它运作起来,并更新了我的问题,如何。。但是你能解释一下为什么这个语法比其他语法更有效吗?

    .submit() 处理程序是个坏主意,因为它会干扰jQuery Validate插件处理表单提交事件的方式。(基本上,你已经阻止了默认的提交,然后再也没有把它交回验证插件。)不管是否是ASP,这绝对不是做它的方法。Validate插件提供 submitHandler 用于任何需要捕获此事件的目的。

    你的 .settings.submitHandler 因为这是定义 服从者 当您没有权限编写自己的 .validate() As per the documentation ,的 服从者 “在验证表单后,通过Ajax提交表单的正确位置” .


    所以,如果我不使用不引人注目的,那么我可以使用我的原始代码?

    .validate() 方法,通常在页面加载时。此方法只能调用一次,所有后续调用都将被忽略。当您使用ASP和不引人注目的验证插件时,它会构造并调用 .validate() 方法,因此您不能再通过调用 你自己。