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:\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 :
EmployeeMenu
Employee Menu


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

ManagerMenu
Manager Menu

No comments:

Post a Comment

Labels

.NET Framework Interview Questions (7) .NET Interview Questions (10) .NET Remoting Interview Questions (1) ADO.NET and BLOB Error (1) ADO.NET Interview Questions (4) Agile Articles (9) AJAX Articles (5) AJAX Interview Questions (11) Algorithms (2) Analytics Articles (2) Analytics Interview Questions (3) Android FAQs - Part 1 (2) Articles (13) ASP.NET Articles (24) ASP.NET Error and Resolution (4) ASP.NET Interview Questions (23) ASP.NET Tutorial (8) AWS Interview Questions (16) Business Analyst Interview Questions (1) Cloud Computing Interview Questions (16) CSharp Articles (17) CSharp Interview Questions (32) CSharp Tutorial (17) Data Analysis (2) Data Structure (1) Design Pattern Articles (5) DevOps Tutorial (1) Digital Marketing Interview Questions (1) Download Templates (1) Error Resolution (6) Excel Articles (9) Excel Macros (1) Excel Tips and Tricks (10) HTML5 Interview Questions (3) HTML5 Tutorial (3) Interview Preparation (2) Interview Questions (24) Introduction to Business Analytics (10) Introduction to Python (7) Introduction to R Programming (23) JAVA Articles (6) Java Tutorial (5) LINQ Articles (4) LINQ Interview Questions (2) LINQ Tutorial (3) Microservices Interview Questions (1) MVCInterviewQuestions (2) OOPs Interview Questions (4) Oracle 9i Tutorial (14) Oracle Articles (2) Oracle Interview Questions (15) Outlook Error (1) PHP Interview Questions (3) PHP Tutorial (3) Product Management (12) Product Management Interview Questions (14) Product Owner Interview Questions (2) Program Management (5) Project Management (13) Project Management Articles (34) Project Management Interview Questions (25) Quiz (1) RallyDev Help (1) Scrum Master Interview Questions (11) Selenium Tutorial (1) Sharepoint Articles (1) SQL Interview Questions (23) SQL Server Articles (20) SSIS Interview Questions (6) SSRS Interview Questions (1) Technical Program Management (12) Technical Program Management - Interview Questions (24) TechnicalProgramManagement (5) Threading Interview Questions (2) Tutorial (8) UML Articles (3) UML Interview Questions (2) Unix (3) UNIX Tutorial (3) WCF Articles (20) WCF Interview Questions (9) WCF Quiz (2) WCF Tutorial (16) Web Service Articles (5) Web Service Interview Questions (3) Window Azure (1) XML Articles (6) XML Interview Questions (3) XML Tutorial (3)