我在web.sitemap中定义了导航,我想要以编程方式禁用某些siteMapNode。怎么可能?
例如我有下一个节点: 我想要禁用节点,如果它有角色=“管理员”
roleManager设置为<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />
,Windows授权没有“管理员”组。它就像虚拟的一样。
我接下来试过了:
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是只读的。
然后尝试了
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
答案 0 :(得分:0)
我接下来意识到了:
我创建了像
这样的新提供者 public class MainSiteMap : StaticSiteMapProvider
{
SiteMapNode _root = null;
public override SiteMapNode BuildSiteMap()
{
if (_root != null)
return _root;
Dictionary<Guid, SiteMapNode> nodes = new Dictionary<Guid, SiteMapNode>();
Guid id = Guid.NewGuid();
string[] roles = new string[] { "*" };
_root = new SiteMapNode(this, id.ToString(), "~/Default.aspx", "Home", "RTD Home page");
foreach (SiteMapNode node in SiteMap.Providers["RootSiteMap"].RootNode.ChildNodes)
{
if (!node.Roles.Contains("Admin"))
{
AddNode(node, _root);
}
}
_root.Roles = roles;
nodes.Add(id, _root);
AddNode(_root, null);
return _root;
}
protected override SiteMapNode GetRootNodeCore()
{
BuildSiteMap();
return _root;
}
}
并在web.config中进行了Provider注册:
<siteMap defaultProvider="MainSiteMap" enabled="true">
<providers>
<add name="MainSiteMap" type="MainSiteMap" />
<add name ="RootSiteMap" type="System.Web.XmlSiteMapProvider" siteMapFile="web.sitemap"/>
</providers>
</siteMap>