0

在我们的应用程序中有两种类型的用户,我们称之为用户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);

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

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

我已经确认 cookie 在Response被读取之前设置在Request.

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

4

1 回答 1

0

我只希望您的假设“在公共页面中,我们不设置任何 cookie 并依赖先前设置的 cookie 来确定要加载的工具栏”如果您调用这些部分操作(您将其称为“公共页面”)工作我猜,通过 Ajax 调用。如果您正在使用

@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,
于 2013-10-14T13:16:04.177 回答