我可以隐藏/显示asp:基于角色的菜单项吗?

kac*_*apy 30 asp.net roles

我能够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>
Run Code Online (Sandbox Code Playgroud)

如何仅向Admin角色中的用户显示其中一个项目?我正在使用asp.net角色提供程序.

Jon*_*lin 28

您可以在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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我敢肯定有一种更简洁的方法可以找到合适的物品去除,但这个有效.您还可以在Page_Load方法中添加所有想要的菜单项,而不是在标记中添加它们.


the*_*ent 23

您可以将菜单项绑定到站点地图并使用roles属性.您需要在Web.Config中启用安全修整才能执行此操作.这是最简单的方法.

网站导航概述:http: //msdn.microsoft.com/en-us/library/e468hxky.aspx

安全修剪信息:http: //msdn.microsoft.com/en-us/library/ms178428.aspx

SiteMap绑定信息: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-你的菜单和安全-DON-T-比赛up.aspx

另一个有效但不太理想的选择是使用loginview控件,它可以显示基于角色的控件.这可能是最快(但最不灵活/高性能)的选择.你可以在这里找到一个指南:http://weblogs.asp.net/sukumarraju/archive/2010/07/28/role-based-authorization-using-loginview-control.aspx


小智 14

我更喜欢使用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);  
        }

    }
Run Code Online (Sandbox Code Playgroud)


Ter*_*lla 9

这最好在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);
            }               
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因为该示例使用了NavigateUrl,所以它不是特定于语言的,并且适用于具有本地化站点地图的站点.