请看下面的点击事件...
Protected Sub btnDownloadEmpl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownloadEmpl.Click Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H() Dim d As String = Format(Date.Now, "d") Dim ad() As String = d.Split("/") Dim fd As String = ad(0) & ad(1) Dim fn As String = "E_" & fd & ".csv" Response.ContentType = "text/csv" Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) CreateCSVFile(emplTable, Response.Output) Response.Flush() Response.End() lblEmpl.Visible = True End Sub
此代码只是将数据从数据表导出到 csv 文件。这里的问题是 lblEmpl.Visible=true 永远不会被击中,因为这段代码不会导致回发到服务器。即使我将代码行 lblEmpl.Visible=true 放在点击事件的顶部,该行执行正常,但页面永远不会更新。我怎样才能解决这个问题?
最佳答案
这一行:
lblEmpl.Visible = True
永远不会被击中,因为这条线:
Response.End()
抛出一个ThreadAbortException
我认为处理此问题的更简洁方法是创建一个简单的 HttpHandler 组件,并在弹出窗口中“打开”它。 (弹出窗口实际上不应该打开。在大多数情况下,浏览器会意识到它实际上是一个下载,并且会抑制选项卡/窗口。)
研究IHttpHandler
接口(interface)。它们实际上很容易实现。
这是一个示例处理程序。抱歉,花了一些时间,我被叫去开会:
public class CensusHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string fileName = String.Format(
CultureInfo.CurrentUICulture,
"E_{0:00}{1:00}.csv",
DateTime.Today.Month,
DateTime.Today.Day
);
context.Response.ContentType = "text/csv";
context.Response.AddHeader(
"Content-Disposition", String.Format(null, "attachment; filename={0}", fileName)
);
//Dump the CSV content to context.Response
context.Response.Flush();
}
public bool IsReusable { get { return false; } }
}
好的,尝试添加一个 javascript onclick 事件来触发下载:
<asp:Button ID="Clickety" runat="server" Text="Click Me!" OnClick="Clickety_Click"
OnClientClick="window.open('Handler.ashx', 'Download');" />
常规 OnClick
事件将触发您的回发代码。 javascript onclick (OnClientClick
) 事件将通过 HttpHandler
启动下载。
关于c# - 强制回发 Asp.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2820161/