我有一个问题,部分视图在不应该缓存的时候被缓存了。此部分视图用于在页面上显示登录/注销。它使用下面的简单代码来确定显示哪个链接
@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 = "*")]
现在我的问题是,当我不希望部分视图被缓存时,整个页面都被缓存了。这会导致错误的行为,即使用户未登录等,它有时也会显示注销。有没有办法缓存所有内容,除了有问题的部分视图?
您可以通过装饰显示您的 _HeaderView 部分的控制器来禁用缓存:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult HeaderView()
{
return PartialView("_HeaderView");
}
你要找的是甜甜圈缓存。这是一篇很棒的文章,解释了它是什么以及如何使其工作http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3
我们应该在 Web.config 文件中设置缓存配置文件,而不是在页面中单独设置缓存值,以避免冗余代码。我们可以使用 OutputCache 属性的 CacheProfile 属性来引用配置文件。此缓存配置文件将应用于所有页面,除非页面/方法覆盖这些设置。
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheProfile" duration="60" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
如果您想从返回部分视图 [_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");
}
回到 MVC 后花了一点时间来解决这个问题。只需将 Cache 设置直接放在 Partial Header View 中即可。与显示用户名时一样。无需全局或服务器端代码。唯一的问题是一旦页面被缓存,它不会在登录后立即刷新。但我们会在最初浏览产品时保持需要的速度。好的,在我们的案例中权衡取舍。
@if (请求.IsAuthenticated) { @* 当我们通过身份验证时,不要再缓存! *@ HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); HttpContext.Current.Response.Cache.SetNoStore(); HttpContext.Current.Response.Cache.SetNoServerCaching(); @*@Html.Raw(DateTime.Now.ToString())*@ @Html.ActionLink("欢迎" + ( 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"}) } 别的 { }
快进到 2023 年,在 .NET Core 中你可以这样做来关闭页面某些部分的缓存:
<cache enabled="false">
@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>
}
</cache>
在此处阅读有关
<cache>
-tag helper 的更多信息:https://learn.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/cache-tag-helper?查看=aspnetcore-7.0