Introduction
In the previous article, I have shown you how to implement treeview in asp.net webform application.In this post, I am going to explain how to create treeview with database data in MVC application.
The ASP.NET TreeView control makes it easy for us to display a hierarchical collection of labeled items, but MVC does not support server-side control like ASP.NET. Also, There is no any HTML helper class method that will provide treeview for the UI. Today I will show you, how to create treeview in MVC application.
Here in this application we will create our own custom HTML helper for display hierarchical data in treeview.
Steps :
Step - 1 : Create New Project.
Go to File > New > Project > Select asp.net MVC4 web application > Entry Application Name > Click OK > Select Internet Application > Select view engine Razor > OKStep-2: Add a Database.
Go to Solution Explorer > Right Click on App_Data folder > Add > New item > Select SQL Server Database Under Data > Enter Database name > Add.Step-3: Create table for fetch data.
Open Database > Right Click on Table > Add New Table > Add Columns > Save > Enter table name > Ok.Step-4: Add Entity Data Model.
Go to Solution Explorer > Right Click on Project name form Solution Explorer > Add > New item > Select ADO.net Entity Data Model under data > Enter model name > Add.A popup window will come (Entity Data Model Wizard) > Select Generate from database > Next >
Chose your data connection > select your database > next > Select tables > enter Model Namespace > Finish.
Step-5: Add a new ASP.NET folder "App_Code"
Go to Solution Explorer > Right Click on Project name form Solution Explorer > Add > Add ASP.NET Folder > App_CodeStep-6: Create a custom HTML Helpers
Right Click on App_Code folder under Solution Explorer > Add > New Item > Select MVC4 View Page (Rozar) > Enter Name (here "Treeview.cshtml") > Add.Write this below code to your newly created view under App_Code folder.
@helper GetTreeView(List<MVCTreeview.SiteMenu> siteMenu, int parentID){ foreach (var i in siteMenu.Where(a=>a.ParentMenuID.Equals(parentID))) { <li> @{var submenu = siteMenu.Where(a => a.ParentMenuID.Equals(i.MenuID)).Count();} @if (submenu > 0) { <span class="collapse collapsible"> </span> } else { <span style="width:15px; display:inline-block"> </span> } <span> <a href="@i.NavURL">@i.MenuName</a> </span> @if (submenu > 0) { <ul> @Treeview.GetTreeView(siteMenu,i.MenuID) @* Recursive Call for Populate Sub items here*@ </ul> } </li> } }
Step-7: Add a new Controller .
Go to Solution Explorer > Right Click on Controllers folder form Solution Explorer > Add > Controller > Enter Controller name > Select Templete "empty MVC Controller"> Add.Step-8: Add new action into your controller for Get Method
Here I have added "simple" Action into "Treeview" Controller. Please write this following codepublic ActionResult Simple() { List<SiteMenu> all = new List<SiteMenu>(); using (MyDatabaseEntities dc = new MyDatabaseEntities()) { all = dc.SiteMenus.OrderBy(a => a.ParentMenuID).ToList(); } return View(all); }
Step-9: Add view for this Action & design.
Right Click on Action Method (here right click on form action) > Add View... > Enter View Name > Select View Engine (Razor) > Check "Create a strong-typed view" > Select your model class > Add. [N:B:Please Rebuild solution before add view.]HTML Code
@model List<MVCTreeview.SiteMenu> @{ ViewBag.Title = "Simple"; } <h2>Simple Treeview from Database Data</h2> <div style="border:solid 1px black; padding:10px; background-color:#FAFAFA"> <div class="treeview"> @if (Model != null && Model.Count() >0) { <ul> @Treeview.GetTreeView(Model, Model.FirstOrDefault().ParentMenuID) </ul> } </div> </div>CSS Code
<style> /*Here We will add some css for style our treeview*/ .collapse { width:15px; background-image: url('../Images/ui-icons_454545_256x240.png'); background-repeat: no-repeat; background-position: -36px -17px; display:inline-block; cursor:pointer; } .expand { width: 15px; background-image: url('../Images/ui-icons_454545_256x240.png'); background-repeat: no-repeat; background-position: -50px -17px; display: inline-block; cursor:pointer; } .treeview ul { font:14px Arial, Sans-Serif; margin:0px; padding-left:20px; list-style:none; } .treeview > li > a { font-weight:bold; } .treeview li { } .treeview li a { padding:4px; font-size:12px; display:inline-block; text-decoration:none; width:auto; } </style>
Here is the Image used in css :
JS Code
<script> $(document).ready(function () { $(".treeview li>ul").css('display', 'none'); // Hide all 2-level ul $(".collapsible").click(function (e) { e.preventDefault(); $(this).toggleClass("collapse expand"); $(this).closest('li').children('ul').slideToggle(); }); }); </script>Complete View
@model List<MVCTreeview.SiteMenu> @{ ViewBag.Title = "Simple"; } <style> /*Here We will add some css for style our treeview*/ .collapse { width:15px; background-image: url('../Images/ui-icons_454545_256x240.png'); background-repeat: no-repeat; background-position: -36px -17px; display:inline-block; cursor:pointer; } .expand { width: 15px; background-image: url('../Images/ui-icons_454545_256x240.png'); background-repeat: no-repeat; background-position: -50px -17px; display: inline-block; cursor:pointer; } .treeview ul { font:14px Arial, Sans-Serif; margin:0px; padding-left:20px; list-style:none; } .treeview > li > a { font-weight:bold; } .treeview li { } .treeview li a { padding:4px; font-size:12px; display:inline-block; text-decoration:none; width:auto; } </style> <h2>Simple Treeview from Database Data</h2> <div style="border:solid 1px black; padding:10px; background-color:#FAFAFA"> <div class="treeview"> @if (Model != null && Model.Count() >0) { <ul> @Treeview.GetTreeView(Model, Model.FirstOrDefault().ParentMenuID) </ul> } </div> </div> @* Here We need some Jquery code for make this treeview collapsible *@ @section Scripts{ <script> $(document).ready(function () { $(".treeview li>ul").css('display', 'none'); // Hide all 2-level ul $(".collapsible").click(function (e) { e.preventDefault(); $(this).toggleClass("collapse expand"); $(this).closest('li').children('ul').slideToggle(); }); }); </script> }
Step-10: Run Application.
Must see next : How to Populate Treeview Nodes Dynamically (On Demand) using Ajax in ASP.NETDownload Application Live Demo
- How to Populate Treeview Nodes Dynamically (On Demand) using Ajax in ASP.NET
- How to Bind Treeview from database using recursion function in asp.net c#?