0

我正在开发一个 ASP.NET MVC3 应用程序。我有一个用于文件下载的控制器:

public ActionResult PDF(string id)
{
    try
    {
        // here I unzip a file, DownName comes from here

        Response.Clear();
        Response.AddHeader("Content-Disposition", 
                           "attachment; filename=" + id + ".pdf");
        Response.ContentType = "application/pdf";
        Response.WriteFile(DownName);
        Response.Flush();
        Response.Close();
        System.IO.File.Delete(DownName);
        return View();
    }
    catch (Exception)
    {
        message = "File not found.";
    }

    return Json(new { message = message }, JsonRequestBehavior.AllowGet);
}

在客户端,我需要获取此 PDF 文件。但是,如果找不到文件,我会提示“找不到文件”之类的文本。我尝试了很多方法,最终得出了这个结论:

$(function(){
  $(".pdf").click(function(e) {
    e.preventDefault();
    $.post("@Url.Action("PDF","Helper")",{id : $(this).data("id")},function(data){
      if(data.message == "File not found.") {
        alert(data.message);
      } else {
        alert(data);
      }
    });
  });
});

如果找不到文件,我可以成功警告错误消息。如何在此处打开数据的保存对话框?我可以为控制器工作的任何其他方式也受到赞赏。

编辑:如果我这样调用控制器,我可以轻松下载文件:

<a href="../../Helper/PDF/@Model.ID">Download PDF</a>

但是,如果结果不是文件和 JSON,页面将被重定向到显示 JSON 对象的空白页面。正如我之前所说,我希望它对屏幕保持警惕。我也很欣赏这种方法的解决方法。

4

1 回答 1

3

您必须从您的操作中返回一个 FileResult。否则,您将无法告诉浏览器下载文件。当通过 javascript 的异步请求请求文件数据时,您无法触发浏览器将该数据保存到本地文件。

当您必须能够检查文件是否存在时,您必须提供两个操作:

public JsonResult PDFAvailable(string id) {
    // check if the file is there
    return Json(new { message = message }, JsonRequestBehavior.AllowGet);
}

public FileResult PDF(string id) {
    // get the filedata
    byte[] fileData = ...;
    return File(fileData, "application/pdf");
}

在您看来,您使用 PDFAvailable 操作 id 检查文件是否存在。如果它不显示您的消息,则使用正常请求调用 PDF 操作:

window.location.href = 
     '@Url.Action("PDF", "YourController", new { id = "yourFileId" })';

编辑

关于您的 chrome 和设置问题location.href:这绝对适用于 chrome。只需做一个测试:创建一个包含以下内容的 html 文件:

<script>
    location.href = "http://www.google.com";
</script>

并在 chrome 中打开它。它应该将您的浏览器重定向到谷歌主页。当它发生时,您的代码还有其他问题。如果没有,请告诉我您使用的是哪个版本的 chrome。

于 2013-05-07T10:51:45.590 回答