Hallo zusammen,
ich würde das Thema gerne nochmal aufgreifen, allerdings mit kleinen Abwandlungen.
Folgende Situation:
Ich möchte dem Benutzer ermöglichen den Inhalt einer SQL-Tabelle nach MS-Access zu exportieren.
Und diese Access-Datei als Download an den Client zurück zuschicken.
Das ganze soll auch in einem Updatepanel ablaufen.
Der Nutzer wählt über eine DDL die SQL-Tabelle aus, welche er exportiert haben möchte und klickt anschließend einen Button.
Passieren soll nun folgendes:
Die Erzeugung der Access-Datei am Server nimmt ja einige Sekunden Zeit in Anspruche.
Wärend des Erzeugens der Access-Datei, soll nun mittels asp:UpdateProgress ein Feedback an den Benutzer gegeben werden. ("Bitte warten")
Soweit funktioniert alles, allerdings bleibt der Inhalt des UpdateProgress weiterhin sichtbar, nach dem die
*.ashx-Datei aufgerufen wurde und der Download-Dialog erfolgt ist.
Gibt es eine Möglichkeit das UpdatePanel auf seinen Ausgangszustand zurückzusetzen, wenn der Client den Download-Dialog seines Browsers erhält?
Sporadische Codebeispiel:
*.aspx
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" AssociatedUpdatePanelID="UpdatePanel1" runat="server">
<ProgressTemplate>
Bitte warten...
</ProgressTemplate>
</asp:UpdateProgress>
*.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(10000);
Response.Redirect("download.ashx");
}download.ashx
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Download : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
FileInfo fi = new FileInfo("c:\\test.txt");
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fi.Name));
HttpContext.Current.Response.AddHeader("Content-Length", fi.Length.ToString());
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.WriteFile(fi.FullName);
HttpContext.Current.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}