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 |