【发布时间】:2011-06-14 17:31:16
【问题描述】:
MvcSiteMapProvider 似乎发生了自动缓存。是否有禁用缓存的机制?我们编写了自定义缓存例程,我想通过这些例程运行它,而不是依赖任何内置的缓存机制。
【问题讨论】:
标签: c# asp.net-mvc caching model-view-controller mvcsitemapprovider
MvcSiteMapProvider 似乎发生了自动缓存。是否有禁用缓存的机制?我们编写了自定义缓存例程,我想通过这些例程运行它,而不是依赖任何内置的缓存机制。
【问题讨论】:
标签: c# asp.net-mvc caching model-view-controller mvcsitemapprovider
尝试在渲染菜单或站点地图之前调用 Refresh。
<% var sm = Html.MvcSiteMap();
((MvcSiteMapProvider.DefaultSiteMapProvider)sm.Provider).Refresh(); %>
....
<%: sm.Menu(0, 1) %>
【讨论】:
Refresh吗?
在 MvcSiteMapProvider v4 中,缓存现在可以扩展或替换为您自己的实现。看看我写的以下博客文章。
MvcSiteMapProvider 4.0 - Extending the Cache
它现在使用 System.Runtime.Caching.ObjectCache,这是一个抽象类,可以由您选择的缓存管理器替换。
【讨论】:
查看源代码,在构建站点地图时始终会创建一个缓存项,将该项存储在HttpContext.Current.Cache 中。此缓存项的生命周期由配置cacheDuration 中的属性配置。如果配置中省略该属性,则默认为 5。尝试将该配置属性设置为 0。
<siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
<providers>
<clear />
<add name="MvcSiteMapProvider"
type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider"
cacheDuration="5" />
</providers>
</siteMap>
【讨论】:
有点老套,但谁在乎:
foreach (var c in from object c in HttpContext.Cache where ((System.Collections.DictionaryEntry)c).Key.ToString().Contains("__MVCSITEMAP") select c)
{
HttpContext.Cache.Remove(((System.Collections.DictionaryEntry)c).Key.ToString());
break;
}
【讨论】: