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 :
![]() |
Employee Menu |
Now change GetRole method to return Employee and Manager role and run the application to see the difference :
![]() |
Manager Menu |