【发布时间】:2013-01-30 16:54:32
【问题描述】:
我有一个网页,用户可以通过 ASP.NET Web 处理程序 (.ashx) 下载 PDF 文件。它的实现方式与此 question 中的答案类似。我遇到的问题是,当我在我的 JavaScript 中这样做 window.top.location.href = url; 时,如果处理程序中抛出异常,我无法真正控制会发生什么。当一切正常时,用户体验是他们基本上停留在他们所在的页面上,并且浏览器告诉他们可以下载 PDF 文件。但是,当处理程序中抛出异常时,它们将被重定向到处理程序的 URL 并显示一个空白页面。
下面是一些示例代码,以使其更清晰:
JavaScript:
function openPDF() {
var url = GeneratePDFUrl();
window.top.location.href = url;
}
处理程序:
public override void Process(HttpContext context)
{
byte[] pdfdata = GetPDFData();
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("content-disposition", "attachment; filename=\"" + GetPDFFileName() + "\"");
context.Response.AddHeader("content-length", pdfdata.Length.ToString());
context.Response.BinaryWrite(pdfdata);
}
当 GetPDFData() 抛出异常时会出现问题。我们正在尽我们所能防止 GetPDFData() 抛出异常,但它是从用户输入生成的,因此我们也在此处处理它,以防出现我们无法/无法预测哪些情况会产生错误。
这是我想出的一种解决方案,但它显示了用户错误文本(而不是空白页)
public override void Process(HttpContext context)
{
try
{
byte[] pdfdata = GetPDFData();
WritePDF(pdfdata, GetPDFFileName()); // Executes code in example above
}
catch (Exception e)
{
context.Response.Clear();
context.Response.Write(GetErrorMessage(e));
}
}
理想情况下,我想向用户显示一个弹出窗口,以便他们留在原来的页面上。
【问题讨论】:
-
如果您已经准备好将标题作为 PDF 发送,那么除了发送一页错误代码(如 -page not found-)之外很难给出消息,但如果您没有将标题发送为pdf和文件名标题,然后您可以像以前一样编写消息。现在在对话框中停留在页面上是不可能的,因为您已经准备好转到其他页面,第一页不再具有控制权。
标签: c# javascript asp.net download