2012-10-14 22 views
1

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

编辑: 在那里我有麻烦的部分是这样的:

@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") 
} 

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

回答

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甜甜圈空洞缓存。

回复评论

听起来像是你想甜甜圈洞缓存。看看this answer可以帮助你。

+0

谢谢,我需要动态生成登录部分,但要缓存任何用户的主要内容。 – Halo