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