2

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");
}
4

2 に答える 2

1

ログインに成功すると、メニューを再バインドできます

Menu mainMenu=(Menu)Page.Master.FindControl("MyMenu");

if(mainMenu!=null)

{ 
   mainMenu.DataBind();
}
于 2013-12-19T09:47:26.277 に答える