我是一名新的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'值的菜单项将不会显示,我不知道原因。 你可以帮我解决这个问题吗?
答案 0 :(得分:0)
您的代码正在从菜单中删除该项目,但是当您稍后进行设置时,您永远不会将其添加回菜单项。
也许不是删除菜单项,而是改变它的可见性而不是?这将允许您隐藏/显示它取决于可见的bool。您还需要在SetMenuItem
函数中实现它。
以下是MenuItem类的MSDN文档。我没有看到可见性设置,但您可以根据需要使用Enabled
或Selected
。然而,这将显示每个人的选项,他们只是无法与它进行交互。不确定这是否可以接受。
这样的事可以让你接近。你必须测试它是如何工作的。
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;
}
}