如何在MVC中使用Ajax打开文件

时间:2015-07-10 14:37:16

标签: javascript jquery ajax asp.net-mvc asp.net-ajax

我有文件名的超链接,想要下载从数据库中检索到的文件。我可以下载该文件,但在此过程中会发布表单。而不是这个,我希望表单不是在ajax的帮助下发布的,但我的代码在Ajax调用中遇到错误。有没有明智的方法来实现这一目标?

查看:

<a onclick="downloadFile(@Model.ID);" target="blank">@Model.FileName</a>


<script>
function downloadFile(id) {

    $.ajax({
        url: '@Url.Action("Download", "Controller")',

        type: "POST",
        data: JSON.stringify({ 'id': id }),
        dataType: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            if (data.status == "Success") {
                alert("Done");
            } else {
                alert("error occurs on the database level!");
            }
        },
        error : function () {
            alert("an error has occured!!!");
        }
    });
}
</script>


控制器:

public FileContentResult Download(int id)
{
    var dataContext = repository.Attachments.FirstOrDefault(p => p.ID == id);
    if (dataContext != null)
    {
        return File(dataContext.FileData, dataContext.FileMimeType);
    }
    else
    {
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

为什么不将链接更改为

<a href="@Url.Action("Download", "Controller", new { id = Model.ID })" >@Model.FileName</a>

答案 1 :(得分:1)

下载文件的最简单方法是直接链接它,如调用操作:&#34; / FileController / Download?Id = 2&#34;

问题是,如果您收到错误,它会将您重定向到空白页面...

为了解决这个问题,我创建了这个函数:

function DownloadFile(id, Type) {
    var hiddenIFrameID = 'hiddenDownloader',
        iframe = document.getElementById(hiddenIFrameID);

    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }

    if (Type == undefined || Type == "")
        Type = null;

    iframe.src = "/File/Download?ID=" + id;
}

此函数创建一个指向文件路径(操作)的隐藏iframe。如果它出错,它不会炸毁你的页面。