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;
}
セッション変数の理由は次のとおりです - menuitemdatabound は、更新/ページ要求のクリックごとに起動し、ユーザー セッションに対してメニューを 1 回だけロードする必要がありました。
問題:
「アイテムの削除」コードは正常に機能します。ユーザーがログインすると、メニュー項目が期待どおりに表示されません。しかし、既存のアイテムをクリックして別のページに移動すると、すべてのメニューがメニューバーに再び表示されます。
なぜこうなった。ページが更新されるか、新しい 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");
}