当具有securityTrimmingEnabled的节点的设置路由值为true时,MvcSiteMapProvider问题

时间:2014-05-15 15:13:55

标签: asp.net-mvc mvcsitemapprovider

我有win auth的项目,我使用" securityTrimmingEnabled"用于检测菜单用户可以访问的部分的选项。

我设置了站点地图节点属性:

siteMapNode.ParentNode.Title = entity.Parent.Title;
siteMapNode.ParentNode.RouteValues["id"] = entity.Parent.Id; 

如果" securityTrimmingEnabled"是假的,一切都好,我在地图路径中有正确的网址(/ portfolio / facility / 57),如果" securityTrimmingEnabled"是的,节点的标题是可以的,但" id" param不正确(/ portfolio / facility / 0)

我如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这基本上是同一个问题described here

AuthorizeAttributeAclModule正在访问Url属性并导致它被请求缓存,因此之后设置影响URL的属性(例如在控制器操作中)无效。

选项1

将设置RouteValues [“id”]的代码移动到IDynamicNodeProvider实现中。这将在应用程序启动时(以及缓存过期时)将值加载到共享缓存中,但它也会在AuthorizeAttributeAclModule触发之前加载它们。

选项2

按照here所述,将设置值的代码移动到Application_BeginRequest事件中。

选项3

创建RequestCacheableSiteMapNode的自定义实现,不覆盖Url属性,自定义SiteMapNodeFactory提供新类的实例,然后将它们注入DI。

选项4

手动删除Url属性的请求缓存值,以便下次访问Url属性时重新生成它。

var parentNode = siteMapNode.ParentNode;

parentNode.Title = entity.Parent.Title;
parentNode.RouteValues["id"] = entity.Parent.Id; 

var urlRequestCacheKey = "__MVCSITEMAPNODE_" + parentNode.SiteMap.CacheKey + "_" + parentNode.Key + "_Url_True_";
this.HttpContext.Items.Remove(urlRequestCacheKey);