Как я могу вывести на веб-форму, прежде чем очистить ответ? - PullRequest
2 голосов
/ 20 октября 2011

У меня есть веб-форма, где пользователь нажимает кнопку и создается файл Excel. Это достигается с помощью этого кода:

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

Я хотел бы добавить в ответ, чтобы, когда пользователь закрывает Excel, он мог видеть сообщение в веб-форме. Но вы не можете сделать это в приведенном выше коде.

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();

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 20 октября 2011
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();
0 голосов
/ 28 августа 2015

Код ниже выполняет именно то, что вы просили.

Он отображает дополнительные теги 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...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...