ASP.NET MVC中的顺序Ajax调用失败

时间:2014-04-21 17:51:04

标签: asp.net-mvc asynchronous upload

我已经看过这个问题的多种解决方案,但没有什么能解决我的问题。

我正在使用ASP.NET MVC 4.5。

以下是我的步骤:

  1. 在页面中使用ajax调用来上传文件。
  2. 在ajax调用结束后,在生成ajax调用的同一函数中运行ajax调用以刷新页面以包含上传的文件。
  3. 我正在使用它作为第一个调用(上传)(另一个Stack Overflow用户的赞美):

    function uploadFiles() {
    
        document.getElementById('fileupload').onsubmit = function () {
            var formdata = new FormData(); //FormData object
            var fileInput = document.getElementById('uploadfilenames');
            //Iterating through each files selected in fileInput
            for (i = 0; i < fileInput.files.length; i++) {
                //Appending each file to FormData object
                formdata.append(fileInput.files[i].name, fileInput.files[i]);
            }
            //Creating an XMLHttpRequest and sending
            var xhr = new XMLHttpRequest();
            xhr.open('POST', '/Dashboard/UploadFiles');
            xhr.send(formdata);
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    //alert(xhr.responseText);  
                }
            }
            return false;
        }
    
        reloadMain();
    }
    

    reloadMain()功能是:

    function reloadMain() {
        $.ajax({
            url: '/Dashboard/ThumbList/' + currentPath,
            type: "GET",
            timeout: 5000,
            success: function (msg) {
                $("#thumb-list").html(msg)
            },
            error: displayError("Unable to get file listing")
        });
    }
    

    我注意到了这一点:

    1. “刷新”不包括响应中的上传文件信息
    2. IE11和Chrome的行为不同。
    3. 似乎问题是控制器/系统没有尽快完成文件操作(我在使用Chrome时看到“拒绝访问...文件正在使用中”错误。
    4. 因此,似乎刷新ajax调用需要等到文件系统完成其工作。

      你同意吗?如果是这样,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

您可以将XMLHttpRequest异步设置为false:

xhr.open('POST', '/Dashboard/UploadFiles', false);

或者您可以在回调中调用刷新函数:

var xhr = new XMLHttpRequest();
xhr.open('POST', '/Dashboard/UploadFiles');
xhr.send(formdata);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
       reloadMain(); //Only refresh after the file post get a 200 response
   }
}