ASP.NET Articles

Setting Menu options Dynamically based on Role in ASP.NET using LINQ

Setting Menu options Dynamically based on Role in ASP.NET using LINQ

Step 1. Add Menu control to aspx or master page.

<asp:Menu ID=”menuRoleBased” runat=”server” Font-Names=”Verdana” ForeColor=”WhiteSmoke” Orientation=”Horizontal”
                            BorderColor=”#FFCC99″ BorderWidth=”0px” Width=”20%” Font-Bold=”False” Font-Size=”Smaller”>
                            <StaticMenuStyle BorderWidth=”1″ BackColor=”#FFCC99″ BorderColor=”White” BorderStyle=”Solid” />
                            <StaticSelectedStyle Font-Names=”Verdana” BackColor=”#415779″ ForeColor=”white” Height=”25px” />
                            <StaticMenuItemStyle CssClass=”menuHoverStyle” Font-Names=”Verdana” HorizontalPadding=”4px”
                                BorderColor=”White” BorderStyle=”Solid” BorderWidth=”1px” ForeColor=”Black” Height=”25px” />
                            <StaticHoverStyle CssClass=”menuOrangeStyle” Height=”25px” Font-Names=”Verdana” ForeColor=”Black” />
                            <DynamicHoverStyle CssClass=”menuOrangeStyle” Height=”25px” Font-Names=”Verdana”
                                ForeColor=”Black” />
                            <DynamicMenuStyle BorderStyle=”Solid” BorderColor=”white” BorderWidth=”1″ Height=”25px”
                                Font-Names=”Verdana” ForeColor=”White” BackColor=”#FFCC99″ />
                            <DynamicSelectedStyle Height=”25px” Font-Names=”Verdana” ForeColor=”White” BackColor=”#001B36″ />
                            <DynamicMenuItemStyle BorderStyle=”Solid” BorderWidth=”1px” BorderColor=”white” Height=”25px”
                                Font-Names=”Verdana” ForeColor=”white” BackColor=”#FFCC99″ HorizontalPadding=”3px” />
                            <DataBindings>
                                <asp:MenuItemBinding DataMember=”Menu” TextField=”title” ValueField=”description”
                                    NavigateUrlField=”url” />
                                <asp:MenuItemBinding DataMember=”SubMenu” NavigateUrlField=”url” TextField=”title”
                                    ValueField=”description” />
                            </DataBindings>
 </asp:Menu>

Step 2 : Add a xml containing Menu  and Submenu Name , Url and Role. Add a xml file to your project and add below xml content to it.

Xml below has two menus – Request Leave menu for Employee and Approve Leave menu for Manager

<?xml version=”1.0″ encoding=”utf-8″ ?>
<RootMenu>
  <Menu url=”” title=”Request” description=”Request” Role=”Employee” MenuOrder=”0″>
    <SubMenu url=”RequestLeave.aspx”  title=”Request Leave” description=”” />
  </Menu>
  <Menu  url=””  title=”Approve” description=”” Role=”Manager” MenuOrder=”1″>
    <SubMenu url=”ApproveLeave.aspx”  title=”Approve Leave” description=”” />
  </Menu>
 </RootMenu>

Step 3: Write a method to return roles of logged in user. In this example, I will create a GetRole method and populate to set Role array to Employee.

 public String[] GetRole()
    {
        return  new String[]{“Employee”};
    }

Step 4 : Write a method to get Menu xml string dynamically based on role.

public String GetMenu()
    {
        string strMenu = string.Empty;
        string[] loggedUserRole= GetRole();
        DataSet dsMenu = new DataSet();
        string strPath = @”D:MenuMenuRole.xml”;
       
        XDocument xmlDoc = XDocument.Load(strPath);

        List<XElement> roleMenu = new List<XElement>();
        var test = from c in xmlDoc.Descendants(“Menu”)
                   join r in loggedUserRole on c.Attribute(“Role”).Value equals r
                   orderby c.Attribute(“MenuOrder”).Value ascending
                   select c;

        foreach (var p in test)
            strMenu = strMenu + p.ToString();
        strMenu = “<RootMenu>” + strMenu + @”</RootMenu>”;
        return strMenu;
    }

Step 5 : Add xmlDataSource control to aspx or masterpage

<asp:XmlDataSource ID=”srcXMLMPA” runat=”server” XPath=”RootMenu/Menu” EnableCaching=”false”>
    </asp:XmlDataSource>

Step 6 : Add the code to bind dynamically created Role based menu xml string to Menu control

srcXMLMPA.Data = GetMenu();
menuRoleBased.DataSource = srcXMLMPA;
menuRoleBased.DataBind();

Now run the web application to see the result . Since Role array was populated with Employee role therefore only Request Menu will be show . See the result below :

EmployeeMenu
Employee Menu

Now change GetRole method to return Employee and Manager role and run the application to see the difference :

ManagerMenu
Manager Menu

Leave a Reply