将控制器调用结果保存为PDF

时间:2013-05-07 10:36:16

标签: jquery json asp.net-mvc-3

我正在开发一个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对象的空白页面。我希望它像我之前所说的那样警惕屏幕。我也很欣赏这种方法的解决方法。

1 个答案:

答案 0 :(得分: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。