1

我在控制器操作之上定义了 OutputCache 属性,以便服务器可以快速向不同用户提供相同的响应。但它缓存了整个页面。我的意思是,如果我缓存了一个返回View(). 因此,母版页顶部的用户帐户信息被每个用户共享。我只想缓存内容页,而不是母版页_Layout.cshtml。我怎样才能排除它?

编辑:我遇到问题的部分是:

@if(Request.IsAuthenticated) {
    <text>Hello <strong>@User.Identity.Name</strong>!</text>
    @: | 
    @Html.ActionLink("Index", "Index", "Account")
    @: |
    @Html.ActionLink("Logout", "Logout", "Account")
}
else
{
    @:|
   @Html.ActionLink("Login", "Login", "Account")
}

当我缓存一个控制器动作时,返回的视图也从缓存中携带了这个用户登录部分,所以它给几乎每个用户都错误的致敬。即使页面被缓存,我如何动态生成这部分?

4

1 回答 1

2

VaryByCustom 是您想要的。

把它放在你的 Global.asax 中:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    return "User".Equals(custom, StringComparison.OrdinalIgnoreCase)
        ? User.Identity.Name
        : base.GetVaryByCustomString(context, custom);
}

...然后使用[OutputCache(VaryByCustom = "User")]属性。

这仍然会导致整个页面被单独缓存,但是会为每个用户创建一个单独的缓存。

如果您正在寻找其他选项,请搜索 MVC 甜甜圈缓存或 MVC 甜甜圈孔缓存。

回复评论

听起来你想要甜甜圈洞缓存。看看这个答案是否对你有帮助。

于 2012-10-14T14:18:43.357 回答