控制器动作方法并不总是被调用

时间:2014-06-24 17:12:03

标签: jquery asp.net-mvc-4

我很抱歉。可能这个问题太具体了,但我有点迷茫。也许你可以指出我正确的方向。我在网页上有一个按钮。单击该功能应获取所选订单并返回每个订单的导出文件以供用户保存。将服务器上的文件导出到特殊文件夹中。这是在点击时运行的功能。

function fancyButtonClick() {
    $.ajax({
            type: "POST",
            url: "~/MyController/GetFileNamesData",
            data: {
                Ids: orderIds
            },
            dataType: "json",
            success: function (result) {
                for (index in result.Files) {
                    var params = [];
                    params["fileName"] = result.Files[index];
                    submitAsForm("~/MyController/DownloadFile", params); }
            }
        }
    });
}

sumbitAsForm函数只创建一个带有隐藏参数输入的表单。 GetFileNamesData方法以JSON格式返回文件路径列表(基本上是字符串列表)。

这是处理请求的控制器操作。

public ActionResult DownloadFile(string fileName)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(fileName);
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, Path.GetFileName(fileName));
}

应该为JavaScript中的for循环中的每个文件调用此方法。问题是,无论文件数量多少,此方法只能被调用一次或两次。我的意思是它并不总是被称为。这可能是什么问题?

更新1:

添加了submitAsForm功能

的代码
function submitAsForm(url, parameters) {
    var form = $('<form/>');
        form = form.hide()
        .attr({ method: "post" })
        .attr({ action: url });
    if (parameters) {
        for (name in parameters) {
            form = form.append($('<input />')
                .attr("type", "hidden")
                .attr({ "name": name })
                .attr({ "id": name })
                .val(parameters[name]));
        }
    }

    form.append('<input type="submit" />')
        .appendTo($("body"))
        .submit();
}

更新2:

我也尝试过不使用任何表单提交,而是使用jquery get function成功,如下所示:

function fancyButtonClick() {
    $.ajax({
            type: "POST",
            url: "~/MyController/GetFileNamesData"),
        data: {
            Ids: orderIds
        },
        dataType: "json",
        success: function (result) {
            for (index in result.Files) {
                $.get(resolvePath("~/MyController/DownloadFile"), {
                    fileName: result.Files[index]
                });
            }
        }
    });
}

在这种情况下,控制器方法一直会命中,但没有任何反应。我的意思是文件下载没有开始。响应成功返回代码200,但浏览器端没有启动文件下载。

更新3:

如果我只是使用

window.location = "~/MyController/DownloadFile?fileName=" + result.Files[index]);

在for循环内部,只有第一个文件被下载并且是它。

0 个答案:

没有答案
相关问题