我有一个带图像按钮的页面。当用户单击图像按钮时,服务器将创建页面的PDF,并将带有下载的响应发送回客户端。问题是这可能需要一些时间。我怎么能/应该等待客户等待?
我最初的想法是在显示加载器GIF的按钮上执行onClientClick事件。但我无法检测到响应何时完成,以便我可以再次隐藏它。我尝试过使用 RegisterStartupScript 以及 Response.Write([script]),但这一切似乎都被PDF的 Response.BinaryWrite(缓冲区)所覆盖) - 文件被下载但没有其他事情发生。
这是我的代码,只有下载逻辑:
protected void imgPrint_Click(object sender, ImageClickEventArgs e)
{
PDF pdf = new PDF();
byte[] buffer = pdf.ExportToPDF(Request.QueryString["id"].ToString(), Request.QueryString["mode"].ToString());
string att = "attachment; filename=" + Request.QueryString["mode"].ToString() + ".pdf";
Response.ClearContent();
Response.AddHeader("content-disposition", att);
Response.ContentType = "application/pdf";
Response.ContentEncoding = Encoding.Default;
Response.BinaryWrite(buffer);
}
带有onClientClick事件的图像按钮,当前只显示警告:
<asp:ImageButton ID="imgPrint" runat="server"
ImageUrl="~/bilder/skriv_ut.png" Width="45" Height="36"
onclick="imgPrint_Click" OnClientClick="loader(true);" />
答案 0 :(得分:1)
在webform中,你可以使用Jquery&amp; web服务
function loader(show) {
if(show)
{
//show loading here
}
$.ajax({
type: "POST",
url: "MyService.asmx/myMethod",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
//do some thing & hide loading
},
error: function (data) {
//do some thing & hide loading
}
});
}
});
[WebService, ScriptService]
public class MyService : WebService
{
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string myMethod()
{
PDF pdf = new PDF();
byte[] buffer = pdf.ExportToPDF(Request.QueryString["id"].ToString(), Request.QueryString["mode"].ToString());
string att = "attachment; filename=" + Request.QueryString["mode"].ToString() + ".pdf";
Response.ClearContent();
Response.AddHeader("content-disposition", att);
Response.ContentType = "application/pdf";
Response.ContentEncoding = Encoding.Default;
Response.BinaryWrite(buffer);
return "ok";
}
}
答案 1 :(得分:0)
通常,我会将Generic Handler
和Hyperlink
用于可下载的文件或图片。
Generic Handler:
public class DocumentsHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
Document doc; // any type
if (doc!= null)
{
context.Response.ContentType = MimeMapping.GetMimeMapping(doc.FileName);
context.Response.AddHeader("Content-Disposition", string.Format("filename={0}", doc.FileName));
context.Response.OutputStream.Write(doc.Data, 0, doc.Data.Length);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
.cs页面:
lnkDocument.NavigateUrl = String.Format("~/Handlers/DocumentsHandler.ashx?{0}",documentId);
当用户想要查看/下载文件时,他们会点击超链接。在您的情况下,网页将立即加载,点击超链接后将会耗费大量时间。