在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等。有没有一种方法可以缓存除有问题的局部视图以外的所有内容?
你在找什么叫甜甜圈缓存。下面是一篇很好的文章,解释它是什么以及如何使其工作http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3
我确实试过这个,但它没有按预期工作。我仍然遇到与在部分操作中使用outputcache属性相同的问题,即手动刷新主页。 – SimpleUser 2012-01-09 11:52:13
我很乐意提供帮助,但没有看到你的代码会很难:)但它对我有效。当你测试时,请记住关于正确的浏览器设置(有时他们会覆盖服务器设置,并且假设一些错误的东西不起作用) – torm 2012-01-09 12:05:46
不,只是我有一个非常缓慢的时刻。与流感合作显然不是一个好主意。但现在这个工作。感谢您的帮助 – SimpleUser 2012-01-09 12:38:17
您可以通过装饰,显示你的_HeaderView部分具有以下控制器禁用缓存:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult HeaderView()
{
return PartialView("_HeaderView");
}
嗨,尼克。感谢您的输入。但是我没有与局部视图相关的控制器动作(现在无论如何)。我使用Html.Partial()调用它。唯一的解决方法是使用上述控制器进行操作? – SimpleUser 2012-01-09 10:31:36
也许你可以添加一个共享控制器并添加一个返回PartialView(“_ HeaderView”)的HeaderView动作;并在上面的答案中加注了注释。希望这会给你你需要的控制,而不是一个巨大的变化。让我知道,如果这对你有用,或者你需要更多的澄清。 – Nick 2012-01-09 10:35:14
谢谢尼克。我将执行这些更改并让您知道它是如何发生的。 – 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");
}
+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 { }
尼克,对不起,必须在这里添加评论。无论如何,它在我移除Nostore并将持续时间更改为1时起作用。现在唯一的问题是当用户登录时,它们被带到主页,但我必须明确地刷新它以使更改生效(显示注销而不是登录)。 – SimpleUser 2012-01-09 11:26:54