web-dev-qa-db-ja.com

ロールに基づいてasp:Menu項目を非表示/表示できますか?

ロールに基づいてasp:Menuコントロールの特定のメニュー項目を非表示にできますか?

<asp:Menu ID="mTopMenu" runat="server" Orientation="Horizontal" />
    <Items>
        <asp:MenuItem Text="File">
            <asp:MenuItem Text="New Project" />
            <asp:MenuItem Text="Release Template" NavigateUrl="~/Release/ReleaseTemplate.aspx" />
            <asp:MenuItem Text="Release Schedule" NavigateUrl="~/Release/ReleaseSchedule.aspx" />
            <asp:MenuItem Text="Roles" NavigateUrl="~/Admin/AdminRoles.aspx" />
        </asp:MenuItem>
    </Items>
</asp:Menu>

これらのアイテムの1つを管理者ロールのユーザーのみに表示するにはどうすればよいですか? asp.netロールプロバイダーを使用しています。

30
kacalapy

メニュー項目をサイトマップにバインドし、ロール属性を使用できます。これを行うには、Web.Configでセキュリティトリミングを有効にする必要があります。これが最も簡単な方法です。

サイトナビゲーションの概要: http://msdn.Microsoft.com/en-us/library/e468hxky.aspx

セキュリティトリミング情報: http://msdn.Microsoft.com/en-us/library/ms178428.aspx

サイトマップバインディング情報: http://www.w3schools.com/aspnet/aspnet_navigation.asp

良いチュートリアル/概要はこちら: http://weblogs.asp.net/jgalloway/archive/2008/01/26/asp-net-menu-and-sitemap-security-trimming-plus-a-trick- for-when-your-menu-and-security-don-t-match-up.aspx

動作するが理想的ではない別のオプションは、ロールに基づいてコントロールを表示できるloginviewコントロールを使用することです。これは、最も速い(ただし柔軟性/パフォーマンスが最も低い)オプションかもしれません。ここにガイドがあります: http://weblogs.asp.net/sukumarraju/archive/2010/07/28/role-based-authorization-using-loginview-control.aspx

23
theChrisKent

次のように、Page_Loadで不要なメニュー項目を削除できます。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Roles.IsUserInRole("Admin"))
        {
            MenuItemCollection menuItems = mTopMenu.Items;
            MenuItem adminItem = new MenuItem();
            foreach (MenuItem menuItem in menuItems)
            {
                if (menuItem.Text == "Roles")
                    adminItem = menuItem;
            }
            menuItems.Remove(adminItem);
        }
    }

削除する適切なアイテムを見つけるためのよりきれいな方法があると確信していますが、これは機能します。マークアップに追加する代わりに、Page_Loadメソッドに必要なすべてのメニュー項目を追加することもできます。

28
Jon Hallin

FindItemメソッドを使用し、値パスを使用してアイテムを検索することを好みます。メニューのPathSeparatorプロパティがFindItemパラメーターで使用しているものと一致することを確認してください。

    protected void Page_Load(object sender, EventArgs e)
    {

        // remove manage user accounts menu item for non-admin users.
        if (!Page.User.IsInRole("Admin"))
        {
            MenuItem item = NavigationMenu.FindItem("Users/Manage Accounts");
            item.Parent.ChildItems.Remove(item);  
        }

    }
14
BMASolutions

これは、MenuItemDataBoundで行うのが最適です。

protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
    if (!Page.User.IsInRole("Admin"))
    {
        if (e.Item.NavigateUrl.Equals("/admin"))
        {
            if (e.Item.Parent != null)
            {
                MenuItem menu = e.Item.Parent;

                menu.ChildItems.Remove(e.Item);
            }
            else
            {
                Menu menu = (Menu)sender;

                menu.Items.Remove(e.Item);
            }               
        }
    }
}

この例ではNavigateUrlを使用したため、言語固有ではなく、ローカライズされたサイトマップを持つサイトで機能します。

9
Terence Golla

SIMPLEメソッドはすべての場合に最適とは限りません

        <%                
            if (Session["Utype"].ToString() == "1")
            {
        %>
        <li><a href="../forms/student.aspx"><i class="fa fa-users"></i><span>STUDENT DETAILS</span></a></li>   
        <li><a href="../forms/UserManage.aspx"><i class="fa fa-user-plus"></i><span>USER MANAGEMENT</span></a></li>
        <%
              }
            else
             {
        %>                      
        <li><a href="../forms/Package.aspx"><i class="fa fa-object-group"></i><span>PACKAGE</span></a></li>
        <%
             }                
        %>
3
Arun Prasad E S

これを試して:

protected void Menu1_DataBound(object sender, EventArgs e)
{
   recursiveMenuVisit(Menu1.Items);
}

private void recursiveMenuVisit(MenuItemCollection items)
        {
            MenuItem[] itemsToRemove = new MenuItem[items.Count];
            int i = 0;

            foreach (MenuItem item in items)
            {
                if (item.NavigateUrl.Contains("Contact.aspx"))
                {
                    itemsToRemove[i] = item;
                    i++;
                }
                else
                {
                    if (item.ChildItems.Count > 0) recursiveMenuVisit(item.ChildItems);
                }
            }

            for(int j=0; j < i; j++)
            {
                items.Remove(itemsToRemove[j]);
            }
        }
2

MenuItemでASP.net NavigationMenuからValueを削除するには:

public static void RemoveMenuItemByValue(MenuItemCollection items, String value)
{
   MenuItem itemToRemove = null;

   //Breadth first, look in the collection
   foreach (MenuItem item in items)
   {
      if (item.Value == value)
      {
          itemToRemove = item;
          break;
      }
   }

   if (itemToRemove != null)
   {
      items.Remove(itemToRemove);
      return;
   }


   //Search children
   foreach (MenuItem item in items)
   {
       RemoveMenuItemByValue(item.ChildItems, value);
   }
}

およびヘルパー拡張:

public static RemoveMenuItemByValue(this NavigationMenu menu, String value)
{
   RemoveMenuItemByValue(menu.Items, value);
}

および使用例:

navigationMenu.RemoveMenuItemByValue("UnitTests");

:すべてのコードはパブリックドメインにリリースされます。帰属は必要ありません。

1
Ian Boyd

サイトマスターページにメニューがあります。 Page_Load()関数を使用して、「Admin」メニュー項目を管理者ロールを持つユーザーにのみ表示しました。

using System;
using System.Linq;
using Telerik.Web.UI;
using System.Web.Security;



<telerik:RadMenu ID="menu" runat="server" RenderMode="Auto"  >
    <Items>
       <telerik:RadMenuItem    Text="Admin"  Visible="true" />
    </Items>
 </telerik:RadMenu>

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        RadMenuItem item = this.menu.FindItemByText("Admin");
        if (null != item)
        {
            if (Roles.IsUserInRole("Admin"))
            {
                item.Visible = true;   
            }
            else
            {
                item.Visible = false;
            }
        }
    }
}
0
DanLents

ロールに基づいてコンテンツページでメニュー項目を検索するには

 protected void Page_Load(object sender, EventArgs e)
{
   if (Session["AdminSuccess"] != null)
        {
           Menu mainMenu = (Menu)Page.Master.FindControl("NavigationMenu");

    //you must know the index of items to be removed first
    mainMenu.Items.RemoveAt(1);

    //or you try to hide menu and list items inside menu with css 
    // cssclass must be defined in style tag in .aspx page
    mainMenu.CssClass = ".hide";

        }   

}

<style type="text/css">
.hide
    {
        visibility: hidden;
     }
  </style>  
0
Dipen

ページ初期化イベントで親メニューを削除するだけです。

    Protected Sub navMenu_Init(sender As Object, e As System.EventArgs) Handles navMenu.Init
    'Remove the admin menu for the norms
    Dim cUser As Boolean = HttpContext.Current.User.IsInRole("Admin")

    'If user is not in the Admin role removes the 1st menu at index 0
    If cUser = False Then
        navMenu.Items.RemoveAt(0)
    End If
End Sub
0
Brian