我正在尝试设置基于角色/用户的站点地图..(我不能使用securitytrimming,因为角色成员资格提供者,我在服务器端有它,并且它实现起来很复杂)所以我是什么我想要做的就是在获取项目后立即执行此操作。
我的网站地图定义为:
<siteMapNode title="Gestion des roles" url="" description="Gestion des roles">
<siteMapNode url="~/Membership/AddRole.aspx" title="Ajouter Role" description="Ajouter role" />
<siteMapNode url="~/Membership/DeleteRole.aspx" title="Supprimer Role" description="Supprimer un role" />
</siteMapNode>
<siteMapNode title="Gestion des sites" url="" description="Gestion des sites">
<siteMapNode url="~/Membership/AddSite.aspx" title="Ajouter Site" description="Ajouter un nouveau site" />
</siteMapNode>
我现在访问的方式是使用以下代码:
Menu menu = (Menu)Master.FindControl("Menu1");
String valuePath = @"Gestions/Gestion/Ajouter";
MenuItem item = menu.FindItem(valuePath);
if (item.Parent != null)
item.Parent.ChildItems.Remove(item);
但是在执行该项之后为null并抛出异常。 谢谢你的阅读
答案 0 :(得分:0)
您可以使用此递归函数找到基于Url的菜单项 -
private MenuItem FindItem(MenuItemCollection collection, string url)
{
foreach (MenuItem item in collection)
{
if (item.NavigateUrl.Equals(url,
StringComparison.InvariantCultureIgnoreCase))
return item;
if (item.ChildItems.Count > 0)
return FindItem(item.ChildItems, url);
}
return null;
}
protected void Page_Load(object sender, EventArgs e)
{
var menu = (Menu)Master.FindControl("NavigationMenu");
// string valuePath = @"Gestions/Gestion/Ajouter";
string valuePath = @"~/About/About2.aspx";
var item = FindItem(menu.Items, valuePath);
if(item != null)
{
if (item.Parent != null)
item.Parent.ChildItems.Remove(item);
else
menu.Items.Remove(item);
}
}
答案 1 :(得分:0)
如果您因为数据绑定问题在菜单中查找项目时遇到问题,可以使用ASP.NET PreRenderComplete :
protected void Page_PreRenderComplete(object sender, EventArgs e){}