Cookie持久性和最佳实践

时间:2013-10-14 13:04:19

标签: c# asp.net-mvc cookies

在我们的应用程序中,有两种类型的用户,我们称之为AlphaBeta用户。这些用户中的每一个都会看到不同类型的工具栏/菜单。

我们已决定使用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设置为truefalse之前,我们在控制器方法中读取它们,这样加载我们的工具栏,如下所示:

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);

从阅读如何读/写cookie这似乎是正确的方法;将cookie写入Response对象并从Request对象中读取cookie。

我遇到的问题是,当我到达加载工具栏的控制器方法时,IsAlphaIsBeta cookie的值都是空字符串,这会破坏应用程序。

我已确认在Response中读取Cookie之前已在Request中设置了Cookie。

我想知道我是否遗漏了一些基本的东西。

1 个答案:

答案 0 :(得分:0)

我只希望你的假设“在普通页面中,我们不设置任何cookie并依赖于先前设置的cookie来确定要加载哪个工具栏”,如果你调用这些部分动作,你称之为“常见页面“我猜,通过Ajax Calls。如果您正在使用

@Html.RenderAction('nameOfaAtion')

然后我不认为你现有的东西会起作用。

原因是您的主要操作和部分操作都在同一个Http请求周期内执行,因此您尝试从公共页面中的请求对象访问的Cookie尚未作为请求的一部分。

修改

正如我所看到的,您正在对每个页面上的cookie进行硬编码,所以猜猜您也可以执行以下操作。最初不是你想要的方式,但我认为它会做同样的事情。

在您的网页中,将部分视图调用更改为这样。

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

然后更改LoadHeader操作的签名以接收这两个额外参数

public ViewAction LoadHeader(bool IsAlpha, Bool IsBeta)

然后使用viewModel Initialization更改两行,如下所示。

ShowAlphaToolbar = IsAlpha, 
ShowBetaToolbar = IsBeta,