如何在MVCSiteMapProvider中的某些节点上禁用缓存?

时间:2013-04-29 11:11:58

标签: mvcsitemapprovider

我需要根据用户当前正在查看的页面而改变菜单结构。因此,我需要禁用某些节点的缓存,因为这些节点可能会针对每个请求进行更改。我该怎么做?

我尝试过以下方式设置DynamicNode

var dynamicNode = new DynamicNode()
{
    Title = title,
    Action = actionName,
    Controller = controllerName,
    RouteValues = routeValues,
    Attributes = attributes,
    ChangeFrequency = ChangeFrequency.Always,
    LastModifiedDate = DateTime.Now,
    UpdatePriority = UpdatePriority.Automatic,
};

但这似乎没有效果。

我还在 Web.config 文件中设置了cacheDuration="0",没有效果。

我还在DynamicNodeProvider的GetCacheDesctription中设置了以下内容

return new CacheDescription("GuideDynamicNodeProvider")
{
    AbsoluteExpiration = DateTime.Now,
};

也没有效果。

我是否错误地使用了这些设置?关于这方面的文件相当缺乏。

1 个答案:

答案 0 :(得分:1)

不支持禁用特定节点的缓存。但是,您可以通过将缓存持续时间设置为0来禁用整个站点地图的缓存。

如果您要执行的操作是在数据更改时刷新节点,则可以在更新数据时使用SiteMapCacheReleaseAttribute或致电SiteMaps.ReleaseSiteMap()

另一方面,如果数据库中的数据是从不受您控制的来源更新的,您可以自己实现ICacheDependency来创建SqlCacheDependency类,然后使用DI注入它。看看RuntimeFileCacheDependency class,了解如何做到这一点。

请注意ChangeMonitor放入列表的原因是它支持RuntimeCompositeCacheDependency,这允许您为同一个缓存配置多个缓存依赖项。