【发布时间】:2010-08-25 09:06:38
【问题描述】:
我在 web.sitemap 中定义了导航,我想以编程方式禁用某些 siteMapNode。怎么可能?
例如我有下一个节点: 我想禁用节点,如果它有角色=“管理员”
roleManager 的设置类似于<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />,并且 Windows 授权没有“Admin”组。就像虚拟的一样。
接下来我尝试了:
SiteMapNodeCollection tempCollection = new SiteMapNodeCollection(SiteMap.RootNode.ChildNodes);
if (SiteMap.RootNode.ReadOnly)
SiteMap.RootNode.ReadOnly = false;
foreach (SiteMapNode node in tempCollection)
{
if (node.Roles.Contains("Admin"))
{
SiteMap.RootNode.ChildNodes.Remove(node);
}
}
然后我得到:System.NotSupportedException: Collection is read-only.
然后试了一下
SiteMapNodeCollection modifiableCollection = new SiteMapNodeCollection(SiteMap.RootNode.ChildNodes);
foreach (SiteMapNode node in SiteMap.RootNode.ChildNodes)
{
if (node.Roles.Contains("Admin"))
{
modifiableCollection.Remove(node);
}
}
但之后我不知道如何将该新集合插入导航(Menu1 对象)
还尝试处理每个节点抛出处理程序,例如
SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.SiteMapAccess);
private SiteMapNode SiteMapAccess(Object sender, SiteMapResolveEventArgs e)
{
SiteMapNode RootNode = SiteMap.RootNode.Clone(true);
SiteMapNode tempNode = RootNode;
if (tempNode.Roles.Contains("Admin"))
{
tempNode.RootNode.ChildNodes.Remove(tempNode);
}
return RootNode;
}
但是在使用“new”语句之前应该创建 RootNode 对象。虽然我使用了下一个指南:http://msdn.microsoft.com/en-us/library/ms178425.aspx
有什么建议吗? http://forums.asp.net/t/894192.aspx 在这里我发现了有趣的讨论,我没有尝试使用 e.Item.Parent.ChildItems.Remove(e.Item) 的选项
这也是一个有趣的例子How can I remove nodes from a SiteMapNodeCollection?,但我的数据源有 SiteMapDataSource 类型,而不是 Repeater.DataSource
【问题讨论】: