1

我有这样的Web.sitemap文件:

 <?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 />

所以,当我加载网站时,我可以访问所有 MENU 项目,

但根据角色我想删除一些项目,

为了这 :

我写了以下内容:

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);
        }
    }

但问题是,当我放断点时,我发现,没有项目:Menu1.Items;

而且我无法删除几个菜单项,

为什么?

4

2 回答 2

0

.Net Web 不提供每个菜单项的属性来指定可见性。因此,不可能将特定菜单项设置为“显示”每个用户可见。但是需要注意的是,您首先可以不创建菜单项。

例如:不要通过 Visual Studio 设计器视图添加菜单项。添加无论身份验证级别如何都是静态的项目。

在页面加载事件中 - 执行身份验证检查。如果用户通过了身份验证,则通过面向对象的方法创建您希望在通过身份验证时出现的菜单项——利用它们的构造函数并设置任何需要的属性。我在我的 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() 的详细信息就足够了。

于 2014-01-15T16:18:47.770 回答
0

不,不在 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);
        }    
    }
}
于 2013-09-11T00:52:00.957 回答