2010-05-12 38 views
3

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

+0

您正在运行到同一个问题,因为这个帖子:http://stackoverflow.com/questions/2731971/problem-clearing-text-fields-on-vb-net-project-vs2008/2732657#2732657 – 2010-05-12 17:13:19

回答

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; } } 
} 

OK,尝试添加一个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启动下载。

+0

如果我不把Response.End行放在那里会有什么影响。有缺点吗? – 2010-05-12 15:24:07

+0

即使我评论Response.End线,它仍然无法正常工作。 – 2010-05-12 15:25:49

+0

我正在寻找网络,我不确定你的意思。我从来没有使用过HttpHandler。你能指点我一个很好的例子吗? – 2010-05-12 15:38:15

1

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

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

+0

你有这样的代码示例吗? – 2010-05-12 15:27:58

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); 
+0

我试过它不起作用,它会下载数据,但不会刷新页面上的控件 – 2010-05-12 16:33:38

+0

我编辑我的答案,你是否用JS脚本试过 – alejandrobog 2010-05-12 16:36:42

+0

这段代码有点不错,唯一的问题是它会更新然后打开对话框eventhough我说在脚本运行后让标签可见 Dim csvPageJS As String = String.Format(“wi ClientScript.RegisterStartupScript(GetType(Page),“popup”,csvPageJS,True) lblRG.Visible('{0}','mywindow');“,ResolveUrl(”〜/ TESTLOAD.aspx“)) lblRG.Visible = True – 2010-05-12 16:52:19

1

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

  1. 创建弹出一个seprate形式创建CSV,将你的函数新page.cs的负载,并将其发送一个查询字符串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);" /> 
    
+0

感谢您的帮助。你能给我更多的细节吗?我不是这方面的专业人员。我会这样做以添加缺失的部分吗? Dim emplTable As DataTable =Nothing Select Case recordID case 1: emplTable = SiteAccess.DownloadEmployee_H() case 2: emplTable = SiteAccess.DownloadManagers() End Select 2010-05-12 16:40:46

+0

如果你只有两种获取数据的方法,那么你就不需要花哨了。我只是编辑示例将代码放入2个按钮,并将js函数更改为通过参数。我也将你的选择案例添加到了服务器代码中。希望有所帮助。 – 2010-05-12 17:18:37

+0

在你的情况下,我不确定lblEmpl.Visible = True可以在主页面看到。所以如果我正确地关注你,这就是我所得到的。在主页上我有按钮(7个不同的csvs,7个按钮),例如名为DownloadEmployee。我在那个点击事件按钮中运行fnPopUp,它会转到另一个页面并下载,但标签位于主页面而不是弹出页面,所以它不会看到它。 – 2010-05-12 17:51:53