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:\Menu\MenuRole.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 |
Manager Menu |
No comments:
Post a Comment