2013-10-14 114 views
0

在我們的應用程序中有兩種類型的用戶,我們稱它們爲AlphaBeta用戶。每個用戶都會看到不同類型的工具欄/菜單。Cookie持久性和最佳實踐

我們已決定使用cookie跟蹤此情況。我們的大部分頁面要麼是Alpha頁,要麼是Beta頁,然後有一些共同的頁面,AlphaBeta用戶共享。因此,在我們的應用程序的每個視圖,我們知道用戶類型(AlphaBeta),我們有以下代碼:

HttpCookie isAlphaCookie = new HttpCookie("IsAlpha", "false"); // or true 
HttpCookie isBetaCookie = new HttpCookie("IsBeta", "true"); // or false 

isAlphaCookie.Expires = DateTime.MaxValue; 
isBetaCookie.Expires = DateTime.MaxValue; 

Response.Cookies.Add(isAlphaCookie); 
Response.Cookies.Add(isBetaCookie); 

的想法,然後,在普通的網頁,我們不會設置任何cookie,並依靠之前設置的cookie來確定要加載的工具欄。所以,這兩個Cookie設置爲在我們已知的網頁true或以上false之前,我們在其中加載的意見,像這樣的控制器方法閱讀:

HeaderViewModel header = new HeaderViewModel 
{ 
    FirstName = UserProfile.CurrentUser.FirstName, 
    LastName = UserProfile.CurrentUser.LastName, 
    ImageUrl = null, 
    OrganisationName = UserProfile.CurrentUser.OrganisationName, 
    OrganisationUrl = UserProfile.CurrentUser.OrganisationUrl, 
    ShowAlphaToolbar = bool.Parse(Request.Cookies["IsAlpha"].Value), 
    ShowBetaToolbar = bool.Parse(Request.Cookies["IsBeta"].Value), 
    ShowPublicToolbar = false 
}; 

return PartialView("Common/_Header", header); 

從如何讀讀書上/寫的cookies似乎是正確的方法;將cookie寫入Response對象並從Request對象讀取cookie。

我遇到的問題是,當我到達加載工具欄的控制器方法時,IsAlphaIsBeta cookie的值都是空字符串,這會中斷應用程序。

我已確認在Request中讀取它們之前,它們設置在Response中。

我在想我是否在這裏失去了一些基本的東西。

+0

嘗試使用一些瀏覽器工具或小提琴手,看看餅乾真的被存儲在瀏覽器和請求期間發送回服務器。 – mbeckish

+0

你如何稱呼包含工具欄的部分操作?通過ajax或通過@ Html.RenderAction()? – Ankit

+0

檢查設置到cookie中的'ExpiryDate'。 –

回答

0

我只希望你的假設「在通用頁面中,我們不設置任何cookie並依靠先前設置的cookie來確定要加載哪個工具欄」,以便在您調用這些部分操作時工作,您稱之爲我猜,通過Ajax調用「常見頁面」。如果您正在使用

@Html.RenderAction('nameOfaAtion')

話,我不認爲你有什麼到位會工作。

原因是雙方你的主要行動和部分動作,所以你正試圖從Request對象訪問你的網頁常見的餅乾還沒有來作爲請求的一部分相同的HTTP請求週期內執行。

編輯

,我可以看到你是硬編碼在每一頁上的Cookie,這樣你猜你也可以這樣做以下。原本不是你想要做的方式,但我認爲它會做你正在嘗試的同樣的事情。

在您的頁面中,將局部視圖調用更改爲這樣。

@Html.Action("LoadHeader", "Profile", new{IsAlpha=False, IsBeta=true}); 

然後更改LoadHeader行動的簽名與兩行如下視圖模型初始化變化然後接收這兩個額外的參數

public ViewAction LoadHeader(bool IsAlpha, Bool IsBeta) 

ShowAlphaToolbar = IsAlpha, 
ShowBetaToolbar = IsBeta, 
+0

工具欄使用'@ Html.Action(「LoadHeader」,「Profile」)加載。如果這對我不起作用,你能建議一種替代方法嗎? – garethdn

+0

@garethdn請參閱上面的修改。 – Ankit

+0

或者,如果您可以使用ajax加載這個局部視圖,最好。我想你不需要改變任何東西。 – Ankit