在MVC中的局部视图上禁用缓存3

问题描述:

我不应该在部分视图被缓存时出现问题。这部分视图用于显示页面上的登录/注销。它采用简单的代码下面找出哪些链接以显示在MVC中的局部视图上禁用缓存3

@if(Request.IsAuthenticated) {  
    <a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a> 
} 
else { 
    <a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a> 
} 

这部分观点是从我MVC3应用程序的所有页面调用,使用

@Html.Partial("_HeaderView") 

在大多数我的控制器,我有定义输出缓存,所以我可以利用缓存我的内容。

[OutputCache(Duration = 86400, VaryByParam = "*")] 

现在我的问题是,当我不希望部分视图是整个页面被缓存。这导致错误的行为,即使用户没有登录,它有时也会显示LogOff等。有没有一种方法可以缓存除有问题的局部视图以外的所有内容?

+0

尼克,对不起,必须在这里添加评论。无论如何,它在我移除Nostore并将持续时间更改为1时起作用。现在唯一的问题是当用户登录时,它们被带到主页,但我必须明确地刷新它以使更改生效(显示注销而不是登录)。 – SimpleUser 2012-01-09 11:26:54

你在找什么叫甜甜圈缓存。下面是一篇很好的文章,解释它是什么以及如何使其工作http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

+0

我确实试过这个,但它没有按预期工作。我仍然遇到与在部分操作中使用outputcache属性相同的问题,即手动刷新主页。 – SimpleUser 2012-01-09 11:52:13

+0

我很乐意提供帮助,但没有看到你的代码会很难:)但它对我有效。当你测试时,请记住关于正确的浏览器设置(有时他们会覆盖服务器设置,并且假设一些错误的东西不起作用) – torm 2012-01-09 12:05:46

+0

不,只是我有一个非常缓慢的时刻。与流感合作显然不是一个好主意。但现在这个工作。感谢您的帮助 – SimpleUser 2012-01-09 12:38:17

您可以通过装饰,显示你的_HeaderView部分具有以下控制器禁用缓存:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult HeaderView() 
{ 
    return PartialView("_HeaderView"); 
} 
+0

嗨,尼克。感谢您的输入。但是我没有与局部视图相关的控制器动作(现在无论如何)。我使用Html.Partial()调用它。唯一的解决方法是使用上述控制器进行操作? – SimpleUser 2012-01-09 10:31:36

+0

也许你可以添加一个共享控制器并添加一个返回PartialView(“_ HeaderView”)的HeaderView动作;并在上面的答案中加注了注释。希望这会给你你需要的控制,而不是一个巨大的变化。让我知道,如果这对你有用,或者你需要更多的澄清。 – Nick 2012-01-09 10:35:14

+0

谢谢尼克。我将执行这些更改并让您知道它是如何发生的。 – SimpleUser 2012-01-09 10:36:26

我们应该在Web.config文件中设置缓存配置文件,而不是在页面中单独设置缓存值以避免冗余代码。我们可以使用OutputCache属性的CacheProfile属性来引用配置文件。此缓存配置文件将应用于所有页面,除非页面/方法覆盖这些设置。

​​

如果你想禁止从你的行动,返回局部视图[_HeaderView],您可以通过装饰覆盖配置缓存设置,像具体操作方法如下所示的缓存:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult RenderPartialView() 
{ 
    return PartialView("_HeaderView"); 
} 

希望这会帮助你!

这个工作对我来说..

public ActionResult LogOff() 
{ 
    AuthenticationManager.SignOut(); 
    var url = Url.Action("Index", "Web"); 
    HttpResponse.RemoveOutputCacheItem(url);   
    return RedirectToAction("Index", "Web"); 
} 
+0

+1我尝试了所有其他解决方案,它们不能很好地工作,这对我来说就像一个魅力......谢谢:)注意:我没有使用AuthenticationManager.Signout()。 – 2016-11-25 06:28:44

花了一些时间找回到MVC后推测这一个。只需将缓存设置直接放入部分头视图。就像在显示用户名时一样。不需要全局或服务器端代码。唯一的问题是一旦页面被缓存,登录后不会立即刷新。但是我们在初次浏览产品时需要保持速度。在我们的情况下折衷。

 

    @if (Request.IsAuthenticated) 
    { 
      @* when we are authenticated, don't cache any more! *@ 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    HttpContext.Current.Response.Cache.SetNoStore(); 
    HttpContext.Current.Response.Cache.SetNoServerCaching(); 
      @*@Html.Raw(DateTime.Now.ToString())*@ 
    @Html.ActionLink("Welcome " + (String.IsNullOrEmpty(((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")) ? User.Identity.Name : ((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")), "Index", "Manage", routeValues: new { Area = "Store" }, htmlAttributes: new { title = "Manage"}) 
    } 
    else 
    { 
    }