asp 菜单控件位于母版页中。它的数据源是一个 web.sitemap 文件。该文件最初将所有项目/页面声明为节点。在用户登录后,我编写了此代码以根据用户权限从菜单中删除项目。
protected void MyMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
if(Session["MenuLoaded"]==null)
{
SiteMapNode node = (SiteMapNode)e.Item.DataItem;
bool deleteItem = true;
if(lstRoles.Count==0)
lstRoles = (List<tblDetail>)Session["sRoles"];
if(!string.IsNullOrEmpty(node.Description))
{
foreach(var item in lstRoles)
{
if(Convert.ToInt32(node.Description)==item.FormId)
{
deleteItem = false;
break;
}
}
if(deleteItem)
{
if(e.Item.Parent !=null)
{
MenuItem mItem = e.Item.Parent;
mItem.ChildItems.Remove(e.Item);
if(mItem.ChildItems.Count==0)
{
if(mItem.Parent !=null)
{
MenuItem Item = mItem.Parent;
Item.ChildItems.Remove(mItem);
}
else
{
Menu menu = (Menu)sender;
menu.Items.Remove(mItem);
}
}
else
{
Menu menu = (Menu)sender;
menu.Items.Remove(e.Item);
}
}
}
}
}
}
protected void MyMenu_DataBound(object sender, EventArgs e)
{
Session["MenuLoaded"]=true;
}
session 变量的原因是 - menuitemdatabound 会在每次刷新/页面请求点击时触发,我希望菜单只为用户会话加载一次。
问题:
“删除项目”代码工作正常。当用户登录时,菜单项不会按需要显示。但是当他点击一个现有的项目移动到另一个页面时,所有的菜单再次出现在菜单栏中。
为什么会这样。每次刷新页面或请求新的 url 时,我是否应该允许 menuitemdatabound 事件。那不对。是吗?但是还有其他方法吗?或者我可以删除会话条件。
使用 C#
试过这个:
page_load()
{
if(Session["sMenuLoaded"]==null)
lstRoles = (List<tblRoles>)Session["sMenuLoaded"];
else
{
Menu mainMenu = (Menu)Session["sMenuLoaded"];
mainMenu.DataBind();
}
}
mymenu_menuitemdatabound()
{
// remains the same as above
}
mymenu_databound()
{
Session["sMenuLoaded"] = (Menu)Page.Master.FindControl("menuBar");
}