在asp.net网站中动态添加菜单项

7
<asp:Menu ID="mnu" runat="server" PathSeparator="," CssClass="menu" DynamicMenuItemStyle-CssClass="menu">
    <Items>
        <asp:MenuItem Text="home" NavigateUrl="~/Default.aspx"  />
        <asp:MenuItem Text="Aboutus" NavigateUrl="#"/>
        <asp:MenuItem Text="Support" NavigateUrl="#" />


    </Items>
</asp:Menu>

我有这个主页面中菜单,当用户登录网站时,根据用户角色,我想从服务器端添加菜单项。我该怎么做呢?
管理员(要添加的菜单-->组织、信息、群组) 用户(要添加的菜单-->信息、群组)
由于我有6种角色,因此每种角色都有不同的菜单项。应该如何实现呢?
4个回答

8
在主控件的Page_Load事件中,您可以检查用户是否具有某些角色,并动态向菜单添加值:
protected void Page_Load(object sender, EventArgs e)
{
    if (User.IsInRole("admin"))
    {
        mnu.Items.Add(new MenuItem
        {
            Text = "Administer web site",
            NavigateUrl = "~/admin.aspx"
        });
    }
}

使用此方法,您将不会在代码后台触发MenuItemClick事件。 - Bachask8

3

我通常会使用网站地图和安全修剪。每个siteMapNode都有一个“roles”属性,指示哪些角色允许在菜单中看到链接。*用于所有角色,或者您可以输入由逗号分隔的角色列表。例如:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
  <siteMapNode title="Home" description="Home" 
       url="~/default.aspx" roles="*" >
  </siteMapNode>
  <siteMapNode title="Organization" description="Organization" 
       url="~/Organization.aspx" roles="Admin" >
  </siteMapNode>
  <siteMapNode title="Message" description="Message" 
       url="~/Organization.aspx" roles="Admin, User" >
  </siteMapNode>
</siteMap>

然后您可以在web.config中启用安全修剪:

<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
  <providers>
    <add name="XmlSiteMapProvider"
         description="Default Site Map Provider"
         type="System.Web.XmlSiteMapProvider"
         siteMapFile="Web.sitemap"
         securityTrimmingEnabled="true" />
  </providers>
</siteMap>

您只需要将ASP菜单的数据源设置为站点地图即可。更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/305w735z.aspx和这里:http://msdn.microsoft.com/en-us/library/ms178429(v=vs.80).aspx 我喜欢这种方法,因为添加一个基于角色的菜单项会更加容易。您不需要在代码后台手动检查角色,否则可能会变得非常笨拙。

0

基于动态用户权限的菜单

 C# CLASS FILES
        public class url_details
        {
            public string url;
            public string page_name;
            public string icon;
        }

        C# inside login page            
        List<url_details> url_list = new List<url_details>();            
        foreach (DataRow dr in dataTable.Rows)
        {
            url_details url_item = new url_details();
            url_item.url = dr["url"].ToString();
            url_item.page_name = dr["page_name"].ToString();
            url_item.icon = dr["icon"].ToString();
            url_list.Add(url_item);
        }           
        Session["urls"] = url_list;


        C#-HTML MENU FORM
         <%
            var uruls = (List<url_details>)Session["urls"];
            foreach (var url in uruls)
            {%>
                <li><a href="..<%=url.url %>"><%=url.icon %><span><%=url.page_name %></span></a></li>

            <% }                

        %>

0

用户登录时,您可以创建一个会话。

Session["user"] = user;

在主页面中;

var user = Session["user"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接