强制回发Asp.Net

请看下面的点击事件……

 受保护的子btnDownloadEmpl_Click(ByVal sender As Object,ByVal e As System.EventArgs)处理btnDownloadEmpl.Click
         Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H()
         Dim d As String =格式(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
    结束子

此代码只是将数据从数据表导出到csv文件。 这里的问题是lblEmpl.Visible = true永远不会被命中,因为这段代码不会导致回发到服务器。 即使我在click事件的顶部放置代码行lblEmpl.Visible = true,行也可以正常执行,但页面永远不会更新。 我怎样才能解决这个问题?

这一行:

lblEmpl.Visible = True 

永远不会被击中,因为这一行:

 Response.End() 

抛出ThreadAbortException

我认为更简洁的方法是创建一个简单的HttpHandler组件,并在弹出窗口中“打开”它。 (弹出窗口实际上不应该打开。在大多数情况下,浏览器会意识到它实际上是一个下载,并将禁止选项卡/窗口。)

研究IHttpHandler接口。 它们实际上非常简单。

这是一个示例处理程序。 对不起,花了一段时间,我召集了一个会议:

 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事件来触发下载:

  

常规的OnClick事件将触发您的回发代码。 javascript onclick( OnClientClick )事件将通过HttpHandler启动下载。

您正在将RFC发送到响应流,然后结束它。 因此,一旦所有代码都运行,页面本身现在不再被发送到响应流,因此不会在浏览器中更新。

为了在您需要创建第二个响应流之后实现您的目标。 最简单的方法是通过新的浏览器窗口/弹出窗口。 然后您的CSV可以在弹出窗口中下载,您的初始页面响应可以保留在初始浏览器中。

您应该使用弹出窗口,这样您仍然可以在原始页面上设置标签。 从我看到你可以做这样的事情

  1. 为弹出窗口创建一个单独的表单来创建CSV,将您的函数移动到新的page.cs的加载,并向其发送一个querystring parm,以便导出其dataID。

     Protected Sub onLoad() Dim recordID As Integer = Request.Querystring("dID") Dim emplTable As DataTable = Nothing Select Case recordID case 1: emplTable = SiteAccess.DownloadEmployee_H() case 2: emplTable = SiteAccess.DownloadManagers() End Select Response.Clear() Response.ContentType = "text/csv" Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) CreateCSVFile(emplTable, Response.Output) Response.Flush() Response.End() lblEmpl.Visible = True End Sub 
  2. 从按钮的onClientClick属性启动弹出窗口,或在回发上注册脚本。

     function fnPopUpCSV(expType) { window.open('/popUpPage.aspx?dID=' + expType,'CSVwindow', 'width=300,height=200,menubar=yes,status=yes, location=yes,toolbar=yes,scrollbars=yes'); }   

只需在Page_Load上使用此代码创建一个新页面

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 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() End Sub 

然后在你的原始页面上让你lblEmpl不可见,并注册一个如下所示的脚本,用你的csv打开一个新窗口。

 var csvPageJS = string.Format("window.open ('{0}','mywindow');", ResolveUrl("~/MyCSVPage.aspx")); ClientScript.RegisterStartupScript(typeof(Page), "popup", csvPageJS, true);