3

似乎有MvcSiteMapProvider发生自动缓存。有没有一种机制来禁用缓存?我们编写了定制的缓存例程,我想通过这些例程来运行它,而不是依赖任何内置的缓存机制。禁用MvcSiteMapProvider缓存

回答

6

尝试之前调用刷新呈现菜单或站点地图。

<% var sm = Html.MvcSiteMap(); 
((MvcSiteMapProvider.DefaultSiteMapProvider)sm.Provider).Refresh(); %> 
.... 
<%: sm.Menu(0, 1) %> 
+0

我也可以从控制器调用“Refresh”吗? – Shimmy 2015-07-20 19:31:35

+0

这似乎并不存在于当前版本 – toddmo 2017-01-24 18:27:09

0

查看源代码时,始终在构建站点地图时创建缓存项目,将项目存储在HttpContext.Current.Cache中。此缓存项的生命周期由配置cacheDuration中的属性进行配置。如果该属性被从配置省略,则默认为5.尝试该配置属性设置为0

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true"> 
    <providers> 
    <clear /> 
    <add name="MvcSiteMapProvider" 
     type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" 
     cacheDuration="5" /> 
    </providers> 
</siteMap> 
+0

不幸的是,没有奏效。可能只是等待3.0最终版本,并自己修改源以删除缓存。我宁愿选择禁用缓存,以便随着新版本发布到CodePlex,我可以继续轻松更新MvCSiteMapProvider ... – Scott 2011-01-24 20:03:27

0

有点哈克但谁在乎:

 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; 
     } 
2

在MvcSiteMapProvider V4,缓存现在可以扩展或您自己的实现替换。看看我写的以下博客文章。

MvcSiteMapProvider 4.0 - Extending the Cache

在它现在使用System.Runtime.Caching.ObjectCache,可以由你选择的缓存管理器来代替一个抽象类的封面。