0

マスター ページにあるサイトマップを使用するメニューがあります。ユーザーによっては、特定のメニュー項目を無効にしたい。MSの「役割」のうさぎの穴には絶対に行きたくない。

次の Site.Master があります。

        <div class="clear hideSkiplink">
            <asp:Menu ID="MainMenu" runat="server" DataSourceID="SiteMapDataSource1" 
              Orientation="Horizontal"
              CssClass="menu"
              StaticDisplayLevels="1"
              StaticMenuItemStyle-VerticalPadding="2"
              StaticMenuItemStyle-HorizontalPadding="10"
              StaticMenuItemStyle-Font-Name="Verdana"
              StaticMenuItemStyle-Font-Size="12pt"
              StaticHoverStyle-BackColor="#707070"
              StaticHoverStyle-ForeColor="#550000"

              DynamicMenuStyle-HorizontalPadding="2"
              DynamicMenuStyle-VerticalPadding="2"
              DynamicMenuStyle-BackColor="#E0E0E0"
              DynamicMenuStyle-ForeColor="#FFFFFF"
              DynamicMenuStyle-BorderWidth="1"
              DynamicMenuStyle-BorderColor="#C0C0C0"
              DynamicMenuItemStyle-VerticalPadding="2"
              DynamicMenuItemStyle-Font-Name="Verdana"
              DynamicMenuItemStyle-Font-Size="9pt"
              DynamicMenuItemStyle-ForeColor="#FFFFFF"
              DynamicHoverStyle-BackColor="#707070"
              DynamicHoverStyle-ForeColor="#550000" />               


            <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"  ShowStartingNode="False" />

次のような web.sitemap があります。

<siteMapNode >
    <siteMapNode url="default.aspx" title="Home"  description="" />

    <siteMapNode url="default.aspx?p=0" title="Admin" description="">
        <siteMapNode url="default.aspx?p=55" title="thing1"  description="" />
        <siteMapNode url="default.aspx?p=56" title="thing2"  description="" />
    </siteMapNode>

    <siteMapNode url="default.aspx?p=1" title="Thing3"   description="">
    </siteMapNode>
    <siteMapNode url="default.aspx?p=2" title="Thing4"  description="">
    </siteMapNode>
</siteMapNode>

Site.Master.cs で、Page_Load と MainMenu_MenuItemDataBound の両方に次のコードを追加しようとしました。

Response.Write(MainMenu.Items.Count.ToString());

MainMenu_MenuItemDataBound の下に置いても効果はありません。Page_Load() の下に置くと、正しく表示されたメニューを確認でき、アイテムがあるにもかかわらず、ゼロが出力されます!

事実: メニューは存在します。メニューには項目があります。メニューとアイテムは、これまでのところ正しく表示されます。

たとえば、タイトルが「管理者」のアイテムを(サブメニューアイテムとともに)非表示にしたいのですが、削除したいのですが、非表示にするか無効にしても問題ありません。MainMenu.FindItem を含むさまざまな呪文を試しましたが、このメソッドはアイテムの検索とは関係がないようです。これは、アイテムが見つからない理由は、アイテム数がゼロであるためであることに気付きました (アイテムは表示されますが)。

以下の Dave D による解決策ですが、追加する必要もありました

OnMenuItemDataBound="MainMenu_MenuItemDataBound"

MainMenu タグに。

4

1 に答える 1

1

Menu は page_load ではまだデータにバインドされません。そのため、カウントがありません。

バインドされている MenuItemDataBound 内の項目を確認するには、次のようにします。

protected void MainMenu_MenuItemDataBound(Object sender, MenuEventArgs e)
{

    if (e.Item.Text == "Admin")
    {
        // disable the item
        //e.Item.Enabled = false;

        // remove the menu item
        MainMenu.Items.Remove(e.Item);

    }
}
于 2012-04-18T16:39:59.080 に答える