【问题标题】:Ajax posting to incorrect URL in LaravelAjax 在 Laravel 中发布到错误的 URL
【发布时间】:2018-04-04 14:18:51
【问题描述】:

我有一个页面,其中 Ajax 将视图加载到 Bootstrap 模式中,然后调用 jQuery.validate 并且这有效,但仅在第一个实例上。之后,当表单发生变化,并且 Ajax 调用中的 URL 发生变化时,它仍然会尝试 POST 到之前使用的 URL。

我已使用控制台确认 URL 已更改,我只是不明白为什么会这样,我以前从未遇到过这个问题,而且似乎只发生在 POST 请求中。

代码如下...

按下按钮并从 Laravel Blade 加载特定的模态视图,在本例中为选项视图 (/lead/options)

success: function(result) {
    modal.form.attr('id', widget + 'Lead');
    modal.load.html(result);
    if(widget == 'update'){                     
         modal.dialog.addClass('modal-lg');
         modal.title.text("Edit Lead");
         modal.save.text("Update Lead").removeClass('hide');
         _validateModalForm(widget, modal, lead);
         return false;
    }
    return false;
}

这会调用带有参数的_validateModalForm,代码如下:

_validateModalForm = function(formID, modal, lead){
        console.log(formID);
        var formID = formID;
        var lead = lead || '';
        var prevComplete = 0;
        var formURL = 'leads';
        if(lead != ''){
            formURL = formURL + '/' + lead;
        }
        formURL = formURL + '/' + formID;
        console.log(formURL);
        console.log('form#' + formID + 'Lead');
        $('form#' + formID + 'Lead').validate({
            invalidHandler: function () { //display error alert on form submit              
                EMPGlobal.showAlert(modal.message, '', 'danger', 'There was an error, please check the form, correct, and try again.' , '', '', '', 'warning');
            },
            submitHandler: function (form){ 
                var formData = new FormData($(form)[0]);
                var fileUploadBar = $('#' + formID + 'LeadProgress div.progress-bar');
                $.ajax({
                    url: formURL,
                    data: formData,
                    type: "POST",
                    dataType: "json",
                    cache: false,
                    contentType: false,
                    processData: false,
                    xhr: function(){
                        var xhr = new window.XMLHttpRequest();
                        fileUploadBar.parents('div.progress').removeClass('hide');
                        //Upload progress
                        xhr.upload.addEventListener("progress", function(evt){
                            if (evt.lengthComputable) {
                                var percentComplete = evt.total / evt.loaded;
                                if( percentComplete > prevComplete){
                                    //Do something with upload progress
                                    fileUploadBar.css('width', percentComplete.toFixed(0) + '%');
                                    prevComplete = percentComplete;
                                } else if( percentComplete == 1) {
                                    fileUploadBar.css('width', '100%');
                                }
                            }
                        }, false);
                        return xhr;
                    },
                    success: function (result) {
                        EMPGlobal.showAlert('', '', 'success', result, '', '', '', 'success');
                        $('form#' + formID + 'Lead').validate('destroy');
                        modal.show.modal('toggle');
                        return false;
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        var returnMes = $.parseJSON(jqXHR.responseText);
                        var messages = '';
                        $.each(returnMes, function(i,v){
                            messages = messages + v + '<br>';
                        });
                        returnMes = messages;
                        message = 'A ' + jqXHR.status + ' ' + errorThrown + ' error occured. <br> <i>Message Details: <br> ' + returnMes + '</i>';
                        EMPGlobal.showAlert(modal.message, '', 'danger', message, '', '', '', 'warning', jqXHR.status);
                        if(fileUploadBar.length){
                            fileUploadBar.css('width', '0%');
                            fileUploadBar.parents('div.progress').addClass('hide');
                        }
                    },
                });
                return false;
            }
        });
    }

这行得通。模态关闭,如果这次我按下发送按钮...

if(widget == 'send'){
    modal.dialog.addClass('modal-md');
    modal.title.text("Send Permission Form");
    modal.save.text("Send");
    _validateModalForm(widget, modal, lead);
    return false;
}

然后再次按表单上的提交,然后尝试发布到 /leads/{leadid}/update

这是控制台中上述步骤的输出,根据 console.log 行:

update
leads.js:192 leads/1xXpM0O7PYO/update
leads.js:193 form#updateLead
leads.js:183 send
leads.js:192 leads/1xXpM0O7PYO/send
leads.js:193 form#sendLead
VM5400:1 POST http://ml.energynet.app/sales/leads/1xXpM0O7PYO/update 400 (Bad Request)
(anonymous) @ VM5400:1
send @ jquery-1.11.0.min.js:4
ajax @ jquery-1.11.0.min.js:4
submitHandler @ leads.js:201
d @ VM5441:4
(anonymous) @ VM5441:4
dispatch @ jquery-1.11.0.min.js:3
r.handle @ jquery-1.11.0.min.js:3

关于造成这种情况的任何想法?这也可以按任何顺序发生,比如我先发送,然后更新,我遇到更新试图发布到 /send

希望这已经足够清楚了。如果没有,请告诉我,我会尽量把它说得更清楚。

【问题讨论】:

    标签: php jquery ajax laravel-5.4 blade


    【解决方案1】:

    好的,在对这个问题感到沮丧一个小时后发布了这个问题,我在尝试了一件突然出现在我脑海中的事情后解决了这个问题。

    我在 submitHandler 使用 $.ajax 之前使用了 $.ajaxSetup,它已经解决了问题。

    代码如下:

    _validateModalForm = function(formID, modal, lead){
            var formID = formID;
            var lead = lead || '';
            var prevComplete = 0;
            var formURL = 'leads';
            if(lead != ''){
                formURL = formURL + '/' + lead;
            }
            formURL = formURL + '/' + formID;
            $.ajaxSetup({
                url: formURL,
                type: "POST",
                dataType: "json",
                cache: false,
                contentType: false,
                processData: false,
            });
            $('form#' + formID + 'Lead').validate({
                invalidHandler: function () { //display error alert on form submit              
                    EMPGlobal.showAlert(modal.message, '', 'danger', 'There was an error, please check the form, correct, and try again.' , '', '', '', 'warning');
                },
                submitHandler: function (form){ 
                    var formData = new FormData($(form)[0]);
                    var fileUploadBar = $('#' + formID + 'LeadProgress div.progress-bar');
                    $.ajax({
                        data: formData,
    

    我不确定为什么会这样,也许有人可以解释它为什么会起作用,我只能假设它必须清除某种缓存,但它确实有效!

    希望这将帮助其他有类似问题的人。

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2015-06-19
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多