【问题标题】:How can I output to a webform before I clear a response?在清除回复之前如何输出到网络表单?
【发布时间】:2011-10-20 04:16:09
【问题描述】:

我有一个网络表单,用户单击一个按钮并生成一个 Excel 文件。 这是通过以下代码实现的:

Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=export.txt");
Response.ContentType = "text/csv";
Response.WriteFile(FILENAME);
Response.End();

我想添加到响应中,这样当用户关闭 Excel 时,他们可以在 Webform 上看到一条消息。但是您不能在上面的代码中执行此操作。

Response.Write("Excel generated!"); ************ does not work as response will be cleared!

Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=donman_export.txt");
Response.ContentType = "text/csv";
Response.WriteFile(FILENAME);
Response.End();

我该怎么做?

【问题讨论】:

    标签: asp.net webforms response


    【解决方案1】:
    Response.Write("Excel generated!"); ************ does not work
    Response.Flush();
    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename=donman_export.txt");
    Response.ContentType = "text/csv";
    Response.WriteFile(FILENAME);
    Response.End();
    

    【讨论】:

    • 这将导致此异常:服务器无法在发送 HTTP 标头后附加标头。
    【解决方案2】:

    下面的代码完全符合您的要求。

    它呈现额外的 HTML 标记,因此在向用户显示消息后开始下载:

        protected void Page_Load(object sender, EventArgs e)
        {
            var currentUrl   = Request.Url.OriginalString;
            var currentQuery = Request.Url.Query;
    
            var download = new
            {
                FilePath   = "~/test.csv",
                FileName   = "test.csv",
                FileMime   = "text/csv",
    
                Message    = "Excel generated!",         
                QueryParam = "direct-download",
                Delay      = 2 // seconds
            };
    
            var hasQueryParams = currentQuery.Length > 0;
            var isDownloadUrl  = hasQueryParams && currentQuery.IndexOf( download.QueryParam ) >= 0;
    
            if( isDownloadUrl ) 
            {  
                // Prepare..
                Response.ContentType = download.FileMime;
                Response.Clear();
                Response.BufferOutput = true;
    
                // Transfer..
                Response.AddHeader("content-disposition", "attachment; filename=" + download.FileName);
                Response.WriteFile(download.FilePath);
    
                // Done..
                // Instead of Response.Close()
                // http://stackoverflow.com/q/4583201/2361743
                Response.Flush();
                Context.ApplicationInstance.CompleteRequest(); 
                return;
            }
    
            // Meta-Refresh Tag has to be in <HEAD> section, but not all browsers follow this restriction.
            // IFRAME has to work fine. It is wrapped into <DIV> to be not visible in old browsers.
            const string tagToStartManual      = "<A href='{0}'>{1}</A>"; 
            const string tagToStartAfterDelay  = "<META HTTP-EQUIV='REFRESH' CONTENT='{1};URL={0}'>";
            const string tagToStartImmediately = "<DIV STYLE='{1}'><IFRAME SRC='{0}'></IFRAME></DIV>";
            const string cssToHideFrame        = "width:1px;height:1px;opacity:0.1;overflow:hidden";
    
            // Show your message..
            // And add HTML Tags which would start download:
            Response.Write(download.Message);
    
            var downloadUrl = currentUrl + (hasQueryParams ? "&" : "?") + download.QueryParam;
    
            // You don't have to use all 3 methods...
            Response.Write( String.Format( tagToStartManual, downloadUrl, download.FileName));
            Response.Write( String.Format( tagToStartAfterDelay, downloadUrl, download.Delay) ); 
            Response.Write( String.Format( tagToStartImmediately, downloadUrl, cssToHideFrame) );
    
            // Done. 
            // Waiting for actual download request...
        }
    

    【讨论】:

      猜你喜欢
      • 2019-05-30
      • 1970-01-01
      • 2020-07-28
      • 2017-06-24
      • 2015-07-27
      • 2011-01-11
      • 2018-11-03
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多