如何在服务器响应下载文件之前制作jQuery加载器

时间:2015-01-07 12:15:05

标签: jquery asp.net razor download loader

我是法国人,抱歉我的英语不好。

我有一个缓慢的ASP.NET方法为我生成一个文件:

public ActionResult Method([Bind(Prefix = "Id")] Guid id)
{
    //Long work
    return File(data, "application/pdf", doc.Name + ".pdf");
}

在我的cshtml文件中有一个按钮(我使用Razor):

<a title="Télécharger" onclick="DownloadFile('@entity.Id')"/>

脚本方法:

<script>
    function DownloadFile(id) {
        var url = '@Url.Action("Method", "TheController", new { id = "Id" })'.replace('Id', id);
        $("#divLoading").show();
        $.post(url, null,
        function (data) {
            $("#divLoading").hide();
        });
    }
</script>

divLoading:

<div id="divLoading" style="margin: 0px; padding: 0px; position: fixed; right: 0px;
    top: 0px; width: 100%; height: 100%; background-color: #666666; z-index: 30001;
    opacity: .8; filter: alpha(opacity=70);display:none" >
    <p style="position: absolute; top: 30%; left: 45%; color: White;">
        Génération du document...<img src="../../Content/img/ajax-loader.gif">
    </p>
</div>

调用C#方法,divLoading出现并消失但文件未被导航器下载。

如果我写道:      它的工作。 但装载机并不存在。我想要。

我的问题不是如何在下载文件时制作加载程序,而只是在下载开始之前显示加载程序。

感谢。

1 个答案:

答案 0 :(得分:0)

您无法如此直接地执行此操作,因为响应未发送到浏览器。

作为替代方案,你可以做2个这样的请求:

public ActionResult Method([Bind(Prefix = "Id")] Guid id)
{
    //Long work

    string newGuid = Guid.NewGuid().ToString();
    TempData[newGuid] = data;

    return Content(newGuid);
}

public ActionResult Download(string guid)
{
    byte[] data = (byte[])TempData[guid];

    return File(data, "application/pdf", "teste.pdf");
}

脚本方法:

function DownloadFile(id) {
    var url = '@Url.Action("Method")';
    $("#divLoading").show();
    $.get(url, 
                function (data, textStatus, jqXHR)
                {
                    $("#divLoading").hide();
                    window.location.href = '@Url.Action("Download")' 
                                            + '?guid=' + data;
                }
           );
}