2012-07-17 33 views
0

這是一個MVC3 Web應用程序。在_Layout.cshtml共享視圖中,左側導航樹用於加載左側導航欄右側的頁面。在每個樹列表項上單擊,它將刷新頁面以加載具有相同佈局視圖的相應頁面。這是一個全局變量,如cookie在回發後保留價值,但它應爲不同實例(標籤/窗口)保存不同值

在此_Layout.cshtml中,樹下有一個Select Category鏈接和一個空div(targetDiv)。選擇Category鏈接將打開一個帶有webgrid的jQuery UI模式對話框,並顯示所有'類別'。點擊表格中的任何「類別」鏈接後,對話框將關閉,targetDiv將由AJAX重新加載,以便targetDiv中的webgrid填充此「類別」中的所有「書籍」。

如果用戶點擊任何左導航項目,整個頁面將重新加載。所以我需要保留所選'類別'的'書籍'列表。爲此,當在模式對話框中選擇「類別」時,我保存一個cookie(CategoryId)。在頁面重新加載(文檔準備就緒)時,我在_Layout頁面中使用此cookie,該頁面再次填充此「類別」中的所有「書籍」。

這工作正常,但新的要求是允許在多個「類別」上工作。如果我在瀏覽器的一個選項卡中選擇「類別1」,並通過此類別獲取所有書籍,則在下一個選項卡(同一應用的另一個實例)中,我應該能夠處理不同的「類別」,以及不同的圖書。在這種情況下,我無法使用Cookie,因爲Cookie是在所有選項卡之間共享的。

如何在不同的實例(瀏覽器選項卡/窗口)上設置不同的「類別」?

回答

0

我解決了這個問題。我用過Cookie-less Session Variables in JavaScript。它基本上將您的數據存儲在window.name屬性中,該屬性在重新加載頁面時不會被清除。每個選項卡都有一個不同的window對象(這是我想要的),並且在所有主流瀏覽器中都受支持。

這就像會話cookie,唯一的區別是這個數據不會在正常會話cookie所做的窗口/標籤之間存在。

另請參閱Session variables without cookies

1

如果我正確理解您的問題,最簡單的方法是使用AJAX回發來填充您的targetDiv字段,而不是每次重新加載頁面。然後,您只需加載頁面的相關部分,以便您可以根據需要一次打開多個標籤,而不會相互干擾。

MVC3爲AJAX請求提供了很多支持 - 只需將網格繪製在局部視圖中,當用戶選擇不同的選項時,就可以很容易地對其進行更改。

爲了幫助維護AJAX請求的狀態,您可以將其存儲在表單字段中,並在提出請求時傳遞值 - 有幾種不同的方法可以執行此操作,可以使用AjaxForm並使用請求或使用JQuery向請求添加參數,具體取決於您選擇如何實現表單。您可以將當前的CategoryId存儲爲隱藏字段,並在創建請求時將其添加到請求中。如果您在單個頁面上打開了多個類別,則可以使用具有相同名稱的隱藏字段列表來執行類似複選框組或隱藏字段中的列表編碼操作。

+0

感謝@glenatron,您已經正確理解它。但是我已經在'InsertionMode.Replace'中使用了AJAX,並且'targetDiv'中的那部分是另一個View(在這個視圖中還有一個Search過濾器,在提交時刷新這個部分不僅僅是整個頁面)。但即使用戶點擊樹項目以加載右側的其他頁面,頁面重新加載也可能發生。因此,應該保留已經在網格中的「書籍」集合,這就是爲什麼我要將「categoryId」保存在cookie中的原因。 – 2012-07-17 13:46:10

相關問題