强制回发Asp.Net

时间:2010-05-12 15:16:28

标签: c# asp.net vb.net

请查看以下点击事件...

 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永远不会被命中,因为这段代码不会导致回发到服务器。即使我在click事件的顶部放置代码行lblEmpl.Visible = true,该行也可以正常执行,但页面永远不会更新。我怎样才能解决这个问题?

4 个答案:

答案 0 :(得分:4)

这一行:

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

<asp:Button ID="Clickety" runat="server" Text="Click Me!" OnClick="Clickety_Click"
    OnClientClick="window.open('Handler.ashx', 'Download');" />

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

  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');
    }
    
    <asp:Button ID="btnGenEmplCSV" runat="server" Text="Generate Employee CSV"
    onClientClick="javascript:return fnPopUpCSV(1);" />
    
    <asp:Button ID="btnGenMgrCSV" runat="server" Text="Generate Manager CSV"
    onClientClick="javascript:return fnPopUpCSV(2);" />
    

答案 3 :(得分:0)

只需在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);