在我们的应用程序中,有两种类型的用户,我们称之为Alpha
和Beta
用户。这些用户中的每一个都会看到不同类型的工具栏/菜单。
我们已决定使用Cookie跟踪此事。我们的大多数网页都是Alpha
个网页或Beta
个网页,然后有一些Alpha
和Beta
个用户共享的常见网页。因此,在我们知道用户类型(Alpha
或Beta
)的应用程序的每个视图中,我们都有以下代码:
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);
从阅读如何读/写cookie这似乎是正确的方法;将cookie写入Response
对象并从Request
对象中读取cookie。
我遇到的问题是,当我到达加载工具栏的控制器方法时,IsAlpha
和IsBeta
cookie的值都是空字符串,这会破坏应用程序。
我已确认在Response
中读取Cookie之前已在Request
中设置了Cookie。
我想知道我是否遗漏了一些基本的东西。
答案 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,