2010-08-18 34 views
6

我有一個包含兩個div的ASP.NET頁面。兩者都包含搜索字段和每個字段中包含的搜索按鈕。當我第一次到這個頁面時,Div A有'SearchDiv'類,而Div B有'SearchDivDisabled'。這些類改變了外觀,因此用戶知道他們當前已經啓用了哪種搜索類型。當使用「返回」按鈕時Div的Class不會持續

當單擊Div B時,JavaScript將其更改爲「SearchDiv」類,並將Div A更改爲「SearchDivDisabled」。這一切都像一個魅力。我遇到的問題是當用戶更改Div B時,單擊Div B的搜索按鈕(顯然重定向到結果頁面),然後使用瀏覽器的後退按鈕。當他們返回到搜索頁面時,Div A被再次啓用,並且Div B被禁用,即使他們最後使用了Div B.在搜索按鈕事件處理程序中,我在重定向之前設置了Div的class屬性,希望這會更新服務器上的頁面,因此當用戶返回時,其最後啓用的Div仍將被啓用(不管在首次訪問頁面時啓用了哪一個)。

我相信這涉及到ViewState,但我不確定爲什麼class屬性沒有保存,所以當用戶返回到它所恢復的頁面時。有沒有我在這裏失蹤的東西,或者一些簡單的方法來保證我想要的行爲?謝謝!

編輯:這是按鈕事件處理代碼:

protected void RedirectToResults(int searchEnum, string resultPage) 
{ 
    ShowContainer(searchEnum); 
    Response.Redirect(resultPage + this.webParams.getAllVariablesString(null)); 
} 

    protected void ShowContainer(int searchContainerToShow) 
    { 
    if (searchContainerToShow < 0 || searchContainerToShow > SearchContainers.Count || SearchContainers.Count == 0) 
     return; 

    //disable all search panels 
    foreach (SearchContainer container in SearchContainers.Values) 
    { 
     container.searchDiv.Attributes.Add("class", "SearchDivDisabled"); 
    } 

    //enable selected panel 
    SearchContainers[searchContainerToShow].searchDiv.Attributes.Add("class", "SearchDiv"); 
    } 

RedirectToResults()從與代表所選搜索面板和結果頁面的URL枚舉實際的按鈕事件處理函數調用。 SearchContainers是一個將整數映射到搜索Div的字典。重要的代碼是最後一行,我正在使用「主動」搜索類更新所選搜索容器,而不是禁用的搜索容器(我將其分配給其他div)

其他更新:我在過去的幾天一直在與這個問題作鬥爭。我是那種能夠得到下面的代碼工作(在Page_Load中):

 Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
     Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0. 
     Response.AppendHeader("Expires", "0"); // Proxies. 

但是,這真的是沒有辦法了,因爲其他一切被正確緩存丟失,這讓我更糟糕時相比,我開始了。其他一切似乎都很好,這只是導致我掙扎的div類。

編輯:只是想更新此爲任何其他人遇到此問題。雖然我相信這裏有一個解決方案,設置頁面的緩存能力以強制瀏覽器回發,但是我無法使所有瀏覽器都能正常工作(主要是Firefox給了我適合,這是一個記錄的錯誤)。我確實相信cookie解決方案會起作用,但我覺得這可能比僅僅存儲一對夫婦的狀態所需的複雜一點。

我最終做的是將div的類綁定到它關聯的單選按鈕的狀態(div旁邊有一個單選按鈕,允許用戶使用更直觀的方式啓用搜索麪板)。我注意到這些單選按鈕在使用後退按鈕時保留了正確的選中值,所以我可以保證他們會指出要啓用的正確的div。因此,在JavaScript的onload中,我檢查啓用了哪個單選按鈕,然後相應地調整搜索div的類。這是一個非常大的黑客攻擊,但是在所有瀏覽器中都有100%的效果,並且只用了大約10行JavaScript。

回答

4

因爲你不回發改變div的風格,當用戶點擊後退按鈕它正在回頁面最初是如何發佈的。解決這個問題的簡單方法是讓該按鈕產生一個回傳來切換樣式。

+0

如上所述,'在搜索按鈕事件處理程序中,我在重定向之前設置Div的class屬性,希望這會更新服務器上的頁面,所以當用戶返回時,最後啓用的Div仍然會啓用'所以我正在這樣做。我將用代碼更新原始帖子。 – Kevin 2010-08-18 14:00:16

1

我不認爲ViewState是這裏的問題;它可能需要在客戶端JavaScript代碼中進行管理,因爲客戶端上的切換狀態不會自動反映在服務器上。

你想看看可能是什麼瀏覽器歷史記錄通過歷史點管理功能:http://msdn.microsoft.com/en-us/library/cc488548.aspx

HTH。

0

您可以在搜索按鈕中進行重定向之前,在搜索頁面的onload期間獲取div並在其上設置適當的類之前,將當前設置爲'SearchDiv'類的div的id存儲在SESSION變量中。
這樣,您可以繼續使用JavaScript來切換了div類和重定向到一個不同的頁面之前的數據只保存,避免不必要的崗位

+0

與此問題是使用後退按鈕時OnLoad()不會觸發。因此,無論會話中存儲什麼內容,當用戶返回搜索頁面時,我都無法更改任何內容,因爲它是所有客戶端。 – Kevin 2010-08-19 13:12:31

+0

Kevin,搜索頁面中的OnLoad()沒有被觸發,而是從緩存中獲取頁面。添加Response.Cache.SetCacheability(HttpCacheability.NoCache); 在你的搜索頁面的Page_Load函數中,看看你點擊後面的事件是否被觸發 – 2010-08-19 20:35:08

1

正如我在前面的回答中提到,您可以acheive所有你需要使用會話變量。 既然你已經提到過持續DIV選擇,我曾要求你在會話變量中使用DIV。 如果您希望其他表單數據被保存並將它們全部保存在會話變量中(請確保您在清理完它們之後清理它們)

這將是最簡單的方式需求。

而且使用的是

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
    Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0. 
    Response.AppendHeader("Expires", "0"); // Proxies. 

你可以在你的Page_Load簡單的使用

Response.Cache.SetCacheability(HttpCacheability.Private); 

和acheive相同的功能

讓我知道你是否有實現這個任何sppecific擔憂。

+0

只是想對此添加評論。火狐是一個問題,因爲它基本上忽略了頁面上的「緩存能力」標誌,並會緩存任何想要的。在IE中,這往往有效,但如果你想支持跨瀏覽器,我還沒有找到一種好方法來強制FF使用'後退'導航到頁面時回發。 – Kevin 2010-08-25 14:13:10

3

將設置存儲在客戶端的cookie中,然後在頁面加載時通過JavaScript檢查cookie並更改CSS類。解決此問題的其他方法可能無法正常工作,因爲當用戶點擊Back按鈕時,並不總是從服務器請求該頁面。使用jQuery cookie plugin

// this function will update the style of the divs based on the cookie's settings 
function updateClass(){ 
    var val = $.cookie('myCookieName'); 

    // set your div's class 
    if (!val || val=='divA') 
    { 
     $('#divA').removeClass('SearchDivDisabled'); 
     $('#divA').addClass('SearchDiv'); 
     $('#divB').removeClass('SearchDiv'); 
     $('#divB').addClass('SearchDivDisabled'); 
    }else{ 
     $('#divB').removeClass('SearchDivDisabled'); 
     $('#divB').addClass('SearchDiv'); 
     $('#divA').removeClass('SearchDiv'); 
     $('#divA').addClass('SearchDivDisabled'); 
    } 
} 

// call this passing in 'divA' or 'divB' depending on which is selected 
function updatePage(selectedDiv){ 
    $.cookie('myCookieName', selectedDiv, { path: '/', expires: 10 }); 
    updateClass(); 
} 

// change the class of the divs when the page is finished rendering 
$(document).ready(function(){updateClass();}): 
1

這可能在一個兩個方面來解決。

如果每個搜索表單職位,以不同的URL,則每個URL應該設置一個會話變量,稱爲「LastSearchMethd,例如,要麼‘A’或‘B’。 如果它們二者交到相同的URL,然後簡單地包括分別包含任一「A」或「B」爲每個表單隱藏字段,並保存在會話變量提交的值。

無論哪種方式,你這時就需要呈現每個DIV的風格,根據不同的會話變量的值。

正如其他海報提到,獲得正確的緩存也將是一個考慮因素。