如何使用ASP.NET菜单控件解决此问题?

时间:2015-03-28 13:25:50

标签: c# asp.net asp.net-controls

我是一名新的ASP.NET Web Forms开发人员,现在我正在努力隐藏和显示基于用户角色的ASP.NET菜单控件项。角色由我在数据库中定义,并根据检查用户角色的结果,系统应显示或隐藏一些菜单项。

我在母版页中有以下ASP.NET菜单控件:

<asp:Menu ID="Menu" runat="server" PathSeparator="," Orientation="Horizontal" EnableViewState="false">
    <Items>
        <asp:MenuItem Text="Home" NavigateUrl="~/Pages/Default.aspx" Value="home"></asp:MenuItem>
        <asp:MenuItem Text="Sheet" NavigateUrl="~/Pages/Sheet.aspx" Value="sheet"></asp:MenuItem>
        <asp:MenuItem Text="Test" NavigateUrl="~/Pages/Test.aspx" Value="test"></asp:MenuItem>
    </Items>
</asp:Menu>

在母版页的代码隐藏中,我正在做以下逻辑:

protected void MenuAccess()
 {
    if(Acccess.HasAccess(username))
    {
        if(Access.IsAdmin(username))
        {
            SetMenuItemUrl("sheet", "~/Pages/Sheet.aspx?UserId=");
            HideMenuItem("test");
        }
        if(Access.IsSupport(username))
        {
            SetMenuItem("test");
        }
    }
 }

 protected void HideMenuItem(string valuePath)
    {
        SetMenuItem(valuePath, false, null);
    }

    protected void SetMenuItemUrl(string valuePath, string url)
    {
        SetMenuItem(valuePath, true, url);
    }

    protected void SetMenuItem(string valuePath, bool visible, string url)
    {
        var item = Menu.FindItem(valuePath);
        if (item != null)
        {
            if (url != null)
                item.NavigateUrl = url;

            if (visible == false)
            {
                if (valuePath.LastIndexOf(',') < 0)
                    Menu.Items.Remove(item);
                else
                {
                    MenuItem parent = Menu.FindItem(valuePath.Substring(0, valuePath.LastIndexOf(',')));
                    parent.ChildItems.Remove(item);
                }
            }
        }
    }

但是,如果用户有两个角色:admin和support,那么带有'test'值的菜单项将不会显示,我不知道原因。 你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您的代码正在从菜单中删除该项目,但是当您稍后进行设置时,您永远不会将其添加回菜单项。

也许不是删除菜单项,而是改变它的可见性而不是?这将允许您隐藏/显示它取决于可见的bool。您还需要在SetMenuItem函数中实现它。

以下是MenuItem类的MSDN文档。我没有看到可见性设置,但您可以根据需要使用EnabledSelected。然而,这将显示每个人的选项,他们只是无法与它进行交互。不确定这是否可以接受。

这样的事可以让你接近。你必须测试它是如何工作的。

protected void SetMenuItem(string valuePath, bool visible, string url)
{
    var item = Menu.FindItem(valuePath);
    if (item != null)
    {
        if (url != null)
            item.NavigateUrl = url;

        item.Enabled = visible;
    }
}