2012-06-15 100 views
0

假設我們有兩個頁面:pageX.aspxpageY.aspx。這些頁面利用瀏覽器頂部的主頁面,用戶可以通過多個選項來更改網站的語言。這些語言選擇採用圖像按鈕(國家/地區標誌)的形式,但它們不使用PostbackUrl屬性。相反,他們只是使用事件處理程序。一種這樣的圖像處理程序:PostbackUrl與母版頁

protected void imgbtnEnglish_Click(object sender, ImageClickEventArgs e) 
{ 
    HttpCookie aCookie = new HttpCookie("language"); 
    aCookie.Value = "en-US"; 
    aCookie.Expires = DateTime.Now.AddDays(365); 
    Response.Cookies.Add(aCookie); 

    Response.Redirect(Request.RawUrl); 
} 

pageX.aspx包含圖像按鈕,它具有性質PostbackUrl="pageY.aspx"。此圖像按鈕的唯一目的是帶我們到pageY.aspx

當按下該圖像按鈕時,如預期的那樣,我們被帶到pageY.aspx。當我在瀏覽器中按下BACK(不是控件或任何東西,只是很好的舊後退按鈕)時,我會回到pageX.aspx,這太棒了!...回到頂端這篇文章中的信息適用於:除了貌似,頂級的主頁認爲我仍然在pageY.aspx!因爲即使我現在回到了我的屏幕上的pageX.aspx,點擊頂部的任何一個標誌都會將我帶回pageY.aspx

我可以邏輯推論的唯一的事情是,由於某種原因,因爲它是PostbackUrl,並且它將表單提交給服務器,所以「返回」僅在本地被識別爲發送的表單,而不是整個頁面(包括母版頁)。因此,通過「返回」,我實際上只在表單中「返回」,而不是表單AND主頁面。

我所做的解決我的問題,是使圖像按鈕,帶我去pageY.aspx沒有使用一項PostBackUrl,而是一個Click事件處理一個行:的Response.Redirect(「pageY。 ASPX「);當我這樣做,它工作正常。

我想明白爲什麼會發生這種情況,並且如果Click事件處理程序解決方案是最佳實踐/合適解決方案而不是使用PostbackUrl屬性。

+1

您是否使用Opera瀏覽器? –

+0

哈,確實是我!!我猜你的問題是,它可能是一個瀏覽器特定的東西? – CptSupermrkt

+0

是的,它是特定於瀏覽器的。關於爲什麼我認爲它是歌劇的全部細節在我的答案如下 –

回答

1

當按下後退按鈕瀏覽器恢復了該頁面從緩存連同最新的表單數據,例如文本框保留其輸入的值。但是,Opera試圖變得更智能一些,並恢復JavaScript的最新狀態。

設置PostBackUrl意味着,單擊按鈕時,表單操作將使用JavaScript進行更改,並將表單發佈到此新URL中。因此,當您在Opera中按回時,它會將頁面與JavaScript更改一起恢復到表單操作,這意味着所有後續提交都會轉到此新URL。

我不喜歡使用PostBackUrl,因爲它只支持JavaScript。使用Response.Redirect服務器端和超鏈接客戶端是更好的解決方案。

0

PostbackUrl vs NavigateUrl

基本上與NavigateURL,你正在做一個POST。 Response.Redirect會做GET。我不完全確定你爲什麼看到這種特定的行爲,但它很可能是你的瀏覽器。你使用的是什麼瀏覽器?你嘗試了什麼其他瀏覽器?

至於什麼是做到這一點的最好方式,我想你最好忘了ASP.NET控件和這樣做:

<a href="pageY.aspx"><img src="foo.png" /></a>