【问题标题】:Add items to menu dynamically in asp.net website在 asp.net 网站中动态添加项目到菜单
【发布时间】:2011-11-18 20:33:58
【问题描述】:
<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 个角色,因此每个角色都有不同的菜单项。这是怎么做到的

【问题讨论】:

    标签: c# asp.net menu uinavigationbar


    【解决方案1】:

    基于用户权限的动态菜单

     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>
    
                <% }                
    
            %>
    

    【讨论】:

      【解决方案2】:

      您可以在用户登录时创建会话。

      Session["user"] = user;
      

      在母版页中;

      var user = Session["user"];
      

      【讨论】:

        【解决方案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

        我喜欢这种方法,因为添加新的基于角色的菜单项要容易得多。您不必手动检查代码中的角色,这可能最终会成为一个笨拙的 if 语句。

        【讨论】:

          【解决方案4】:

          在 master 的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 on code behind
          猜你喜欢
          • 2011-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多