後,

2010-02-02 25 views
1

我創建了一個頁面,允許用戶下載文件時,他們點擊一個按鈕,頁面不迴應...按鈕的onclick事件鏈接到以下的代碼塊:後,

this.Page.Response.Clear(); 
this.Page.Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Zip; 
this.Page.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + System.IO.Path.GetFileName(filename) + "\""); 
this.Page.Response.TransmitFile(filename); 
this.Page.Response.Flush(); 
this.Page.Response.End(); 

下載工作正常,但現在當我嘗試與網頁互動(例如,再次點擊下載按鈕),沒有回發。

我是否響應下載請求錯誤(我應該使用不同的/新響應對象),或者是有別的東西,我需要做的,使下載後的頁面中的活動?


編輯:

所以我試過encorporating創建的HttpHandler,並調用Response.Redirect的從按鈕的單擊事件處理程序的兩張海報的建議。

void submitButton_Click(object sender, EventArgs e) 
    { 
     label.Text = "Boo!"; 
     this.Page.Response.Redirect("~/ViewAttachment.ashx?id=foo", false); 
    } 

如果我通過這一步的調試器,它延續了重定向調用後,但頁面只是返回的狀態下,該按鈕不起作用,而唱片公司有自己的缺省值。我現在做重定向錯了嗎?

回答

3

如果使用另一個處理程序的選項?

這裏是前(建議表示歡迎,這是一個快速的寫)我所使用的簡化版本。 The HttpHandler(AttachmentFile僅僅是一個BLOB數據類和一些屬性,當文件被上傳收集):

public class AttachmentHandler : IHttpHandler 
{ 
    public const string QueryKeyID = "ID"; 

    public void ProcessRequest(HttpContext context) 
    {  
    var r = context.Response; 
    var attachmentID = context.Request.QueryString[QueryKeyID]; 

    Attachment a = DataContext.GetById<AttachmentFile>(attachmentID); 

    r.ContentType = a.ContentType; 
    r.AppendHeader("Content-Type", a.ContentType); 
    r.AppendHeader("content-disposition", string.Format("attachment; filename=\"{0}{1}\"", a.AttachmentName, GetExtension(a.FileName))); 
    r.BufferOutput = false; //Stream the content to the client, no need to cache entire streams in memory... 
    r.BinaryWrite(a.BlobData); 
    r.End(); 
    } 

    private static string GetExtension(string fileName) 
    { 
    if(fileName.IsNullOrEmpty()) return string.Empty; 
    var i = fileName.LastIndexOf("."); 
    return i > 0 ? fileName.Substring(i) : string.Empty; 
    } 
} 

web.config

<system.web> 
    <httpHandlers> 
    <add verb="*" path="ViewAttachment.ashx" type="MyNamespace.AttachmentHandler, MyWebDllName"/> 
    </httpHandlers> 
</system.web> 

然後你要做的就是呈現在一個鏈接表單~/ViewAttachment.ashx?ID=5,單擊該按鈕將下載文件,但不會混淆頁面的生命週期。

現在有更多的考慮,比如安全和這樣的....我修剪出來的這個例子。我也使用這種風格的鏈接:~/Attachment/{id}通過webforms路由...如果其中任何一個你感興趣,我會更新包括他們。或者你可以一起討厭這種方法...只是讓你知道這是一個選項。

+0

好的,所以我認爲我主要實現了你的建議,但我仍然得到這種行爲,導致它重定向到另一個頁面後不響應。你有沒有別的想法? – tbischel 2010-02-03 08:03:59

+1

@tbischel - 不要重定向:)只要讓該按鈕成爲該網址的超鏈接,你就全部設置好了。 – 2010-02-03 11:11:28

+0

我一定是瘋了......我已經設置按鈕的回發URL到頁面...同樣的問題。我真的創建超鏈接並在其中放置按鈕控件嗎? – tbischel 2010-02-03 17:07:12

0

通過使用Response.Clear()你已經殺了頭。雖然在瀏覽器中可能看起來有效的HTML標記,但確實沒有。標題消失了,所以看起來仍然呈現的控件無效。如果你點擊「返回」,你應該可以重新發布信息。你可能想要做的是在不同的窗口中使用PostBackUrl在你的按鈕點擊並將窗體的目標設置到不同的窗口(然後使用SetTimeout將其重置爲_self)來調用此調用。

1

你大部分都在那裏。

所有你需要在你的按鈕單擊事件處理程序做的是Response.Redirect的另一個ASPX頁面。把你的代碼寫在另一頁上。

然後一切都會按照您的預期工作。瀏覽器實際上會停留在原始頁面上,而不會進入新頁面,因爲您已將內容設置設置爲附件 - 這非常棒。

+0

我在做重定向錯誤嗎?它仍然不起作用。詳情請參閱編輯... – tbischel 2010-02-03 08:02:53