如何按 asp.net 中的角色隐藏菜单项
本文关键字:角色 隐藏 隐藏菜单 菜单项 何按 asp net | 更新日期: 2023-09-27 18:30:46
我有这样的网站地图文件:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="" title="" description="">
<siteMapNode url="~/Home.aspx" title="Home" description=" this is the home page" />
<siteMapNode url="~/ProjectList.aspx" title="Project List" description="Approved projects" />
<siteMapNode url="" title="Project Choices" description="">
<siteMapNode url="~/StudentChoices.aspx" title="Student Project Choices" description="" />
<siteMapNode url="~/StaffChoices.aspx" title="Supervisor Project Choices" description="" />
</siteMapNode>
<siteMapNode url="~/AllocationList.aspx" title="Project Allocation List" description="" />
<siteMapNode url="" title="Submit Proposal" description="" >
<siteMapNode url="~/submit.aspx" title="New Proposal" description="new proposal" />
<siteMapNode url="~/reSubmit.aspx" title="Re-Submit Proposal" description="re submit proposal"/>
</siteMapNode>
<siteMapNode url="~/StaffRecords.aspx" title="Staff Records" description="" >
<siteMapNode url="~/addStaff.aspx" title="Add new Staff" description="" />
</siteMapNode>
<siteMapNode url="~/StudentRecords.aspx" title="Student Records" description="" />
<siteMapNode url="~/Administration.aspx" title="Administration" description="" />
</siteMapNode>
</siteMap>
在MasterPage中,我写了以下内容:
<asp:Menu ID="Menu1" runat="server" Orientation="Horizontal"
BackColor="#33CCFF" DataSourceID="SiteMapDataSource1" Font-Overline="False"
Font-Size="Larger" ForeColor="Black" ItemWrap="True" StaticDisplayLevels="2"
StaticSubMenuIndent="60px" Width="100%">
<DynamicHoverStyle BackColor="#9999FF" ForeColor="Black" />
<DynamicMenuItemStyle BackColor="#0099FF" ForeColor="Black" />
<DynamicMenuStyle BackColor="#0099FF" />
<DynamicSelectedStyle BackColor="#0099FF" ForeColor="Black" />
</asp:Menu>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
<br />
所以,当我加载网站时,我能够所有菜单项,
但是根据角色,我想删除一些项目,
为此:
我写了以下内容:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ManageMenuItemAsperRoles();
}
}
和在函数 ManageMenuItemAsperRoles();
public void ManageMenuItemAsperRoles()
{
string role = Session["Roles"].ToString();
string AdminRole = ConfigurationManager.AppSettings["AdminRole"];
string StaffRole = ConfigurationManager.AppSettings["StaffRole"];
string StudentRole = ConfigurationManager.AppSettings["StudentRole"];
if (role == StaffRole)
{
MenuItemCollection menuItems = Menu1.Items;
MenuItem ProjectChoicesItem = new MenuItem();
MenuItem StaffRecordsItem = new MenuItem();
MenuItem StudentRecordsItem = new MenuItem();
foreach (MenuItem menuItem in menuItems)
{
if (menuItem.Text == "Project Choices")
ProjectChoicesItem = menuItem;
}
foreach (MenuItem menuItem in menuItems)
{
if (menuItem.Text == "Staff Records")
StaffRecordsItem = menuItem;
}
foreach (MenuItem menuItem in menuItems)
{
if (menuItem.Text == "Student Records")
StudentRecordsItem = menuItem;
}
menuItems.Remove(ProjectChoicesItem);
menuItems.Remove(StaffRecordsItem);
menuItems.Remove(StudentRecordsItem);
}
}
但问题是,当我放置断点时,我发现:菜单1.项目;
而且我无法删除一些菜单项,
为什么?
不,不Page_Load。你必须在 MenuItemDataBound 中执行此操作:
protected void Menu1_MenuItemDataBound(object sender, MenuEventArgs e)
{
string role = Session["Roles"].ToString();
string AdminRole = ConfigurationManager.AppSettings["AdminRole"];
string StaffRole = ConfigurationManager.AppSettings["StaffRole"];
string StudentRole = ConfigurationManager.AppSettings["StudentRole"];
if (role == StaffRole)
{
if (e.Item.Text == "Project Choices" ||
e.Item.Text == "Staff Records" ||
e.Item.Text == "Student Records")
{
Menu1.Items.Remove(e.Item);
}
}
}
.Net Web 不为每个菜单项提供属性来指定可见性。因此,无法将特定菜单项设置为"显示"每个用户可见。但需要注意的是,您一开始就不能创建菜单项。
例如:不要通过Visual Studio Designer视图添加菜单项。添加静态项目,而不考虑身份验证级别。
在页面加载事件中 - 执行身份验证检查。如果用户已通过身份验证,则通过面向对象的方法创建要在身份验证时显示的菜单项 - 利用其构造函数并设置任何所需的属性。我在 Site.Master 页中执行此操作:因为我希望菜单对所有页面都以这种方式运行。
但是,如果需要,您可以按单独的页面执行此操作。
protected void Page_Load(object sender, EventArgs e)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
MenuItem m = new MenuItem("Upload");
m.NavigateUrl = "~/Uploader/Upload.aspx";
NavigationMenu.Items.Add(m);
}
}
PS - 我已经在类似问题的其他地方发布了这个答案,但答案对于这种情况仍然有效。若要进一步增强此功能,可以分析 HttpContext.Current.User.Identity 类,以获取用户的用户名,然后专门为用户显示菜单选项。但是,您不应依赖用户名本身来验证用户角色。使用数据库中的 UID,并将非用户友好的令牌分配给用户作为其标识,这将使其比标识其帐户的字符串变量更安全。但这是讨论一个不同的话题,现在:上面关于 MenuItem() 的细节应该就足够了。