Hi,
Here's an example of creating an alphabetical paging in ASP.NET MVC. This is a VB.NET version of Mikesdotnetting alphabetical paging in asp.net mvc. I use AdventureWorks database instead of Northwind. Other changes are reflected in the User Interface (View) and Model. If your going to perform this tutorial using ASP.NET MVC 4 (VS 2012) make sure to add Bootstrap in your project using Nuget.
Steps:
1. Create an ASP.NET MVC 5 project using VS 2013
2. Install AdventureWorks Database in your Server
3. Add an ADO.NET Entity framework that points to AdventureWorks database
*AdventureWorksEntities.edmx
Tables:
- Production.Product
- Production.ProductSubCategory
4. The files involved are the following:
- ProductModel.vb
- HtmlHelpers.vb
- HomeController.vb
- AlphabeticalPagingViewModel.vb
- Index.vbhtml
See solution structure below:
5. Source Code
ProductModel.vb
HtmlHelpers.vbCode:Imports System.Collections.Generic Imports System.Linq Imports System.Web Public Class ProductModel Public Property ProductID() As Integer Get Return m_ProductID End Get Set(value As Integer) m_ProductID = Value End Set End Property Private m_ProductID As Integer Public Property ProductNumber() As String Get Return m_ProductNumber End Get Set(value As String) m_ProductNumber = Value End Set End Property Private m_ProductNumber As String Public Property ProductName() As String Get Return m_ProductName End Get Set(value As String) m_ProductName = Value End Set End Property Private m_ProductName As String Public Property StandardCost() As Decimal Get Return m_StandardCost End Get Set(value As Decimal) m_StandardCost = value End Set End Property Private m_StandardCost As Decimal Public Property Color() As String Get Return m_Color End Get Set(value As String) m_Color = value End Set End Property Private m_Color As String Public Property ProductCategory() As String Get Return m_ProductCategory End Get Set(value As String) m_ProductCategory = value End Set End Property Private m_ProductCategory As String End Class
HomeController.vbCode:Imports System.Collections.Generic Imports System.Linq Imports System.Web Imports System.Text Imports System.Web.Mvc Imports System.Runtime.CompilerServices 'Public Class HtmlHelper Public Module HtmlHelpers <Extension()> Public Function AlphabeticalPager(html As HtmlHelper, selectedLetter As String, firstLetters As IEnumerable(Of String), pageLink As Func(Of String, String)) As HtmlString Dim sb = New StringBuilder() Dim numbers = Enumerable.Range(0, 10).[Select](Function(i) i.ToString()) Dim alphabet = Enumerable.Range(65, 26).[Select](Function(i) ChrW(i).ToString()).ToList() alphabet.Insert(0, "All") alphabet.Insert(1, "0-9") Dim ul = New TagBuilder("ul") ul.AddCssClass("pagination") ul.AddCssClass("alpha") For Each letter As String In alphabet Dim li = New TagBuilder("li") If firstLetters.Contains(letter) OrElse (firstLetters.Intersect(numbers).Any() AndAlso letter = "0-9") OrElse letter = "All" Then If selectedLetter = letter OrElse String.IsNullOrEmpty(selectedLetter) AndAlso letter = "All" Then li.AddCssClass("active") Dim span = New TagBuilder("span") span.SetInnerText(letter) li.InnerHtml = span.ToString() Else Dim a = New TagBuilder("a") a.MergeAttribute("href", pageLink(letter)) a.InnerHtml = letter li.InnerHtml = a.ToString() End If Else li.AddCssClass("inactive") Dim span = New TagBuilder("span") span.SetInnerText(letter) li.InnerHtml = span.ToString() End If sb.Append(li.ToString()) Next ul.InnerHtml = sb.ToString() Return New HtmlString(ul.ToString()) End Function End Module
Code:Imports System Imports System.Collections.Generic Public Class HomeController Inherits System.Web.Mvc.Controller Function Index(selectedLetter As String) As ActionResult Dim model = New AlphabeticalPagingViewModel() model.SelectedLetter = selectedLetter Using context = New AdventureWorks2012Entities() model.FirstLetters = context.Products.GroupBy(Function(p) p.Name.Substring(0, 1)) _ .[Select](Function(x) x.Key.ToUpper()).ToList() model.Products = New List(Of ProductModel)() If String.IsNullOrEmpty(selectedLetter) OrElse selectedLetter = "All" Then model.Products.AddRange((From item In context.Products Group Join category In context.ProductSubcategories On item.ProductSubcategoryID Equals category.ProductSubcategoryID Into ProductCategory = Group From category In ProductCategory.DefaultIfEmpty() Select New ProductModel() With { _ .ProductName = item.Name, _ .ProductID = item.ProductID, _ .ProductNumber = item.ProductNumber, _ .Color = If((String.IsNullOrEmpty(item.Color)), "NA", item.Color), _ .StandardCost = item.StandardCost, _ .ProductCategory = If((String.IsNullOrEmpty(category.Name)), "NA", category.Name) _ }).ToList()) Else If selectedLetter = "0-9" Then Dim numbers = Enumerable.Range(0, 10).[Select](Function(i) i.ToString()) model.Products.AddRange((From item In context.Products Where (numbers.Contains(item.Name.Substring(0, 1))) Group Join category In context.ProductSubcategories On item.ProductSubcategoryID Equals category.ProductSubcategoryID Into ProductCategory = Group From category In ProductCategory.DefaultIfEmpty() Select New ProductModel() With { _ .ProductName = item.Name, _ .ProductID = item.ProductID, _ .ProductNumber = item.ProductNumber, _ .Color = If((String.IsNullOrEmpty(item.Color)), "NA", item.Color), _ .StandardCost = item.StandardCost, _ .ProductCategory = If((String.IsNullOrEmpty(category.Name)), "NA", category.Name) _ }).ToList()) Else model.Products.AddRange((From item In context.Products Where (item.Name.StartsWith(selectedLetter)) Group Join category In context.ProductSubcategories On item.ProductSubcategoryID Equals category.ProductSubcategoryID Into ProductCategory = Group From category In ProductCategory.DefaultIfEmpty() Select New ProductModel() With { _ .ProductName = item.Name, _ .ProductID = item.ProductID, _ .ProductNumber = item.ProductNumber, _ .Color = If((String.IsNullOrEmpty(item.Color)), "NA", item.Color), _ .StandardCost = item.StandardCost, _ .ProductCategory = If((String.IsNullOrEmpty(category.Name)), "NA", category.Name) _ }).ToList()) End If End If End Using Return View(model) End Function End Class
AlphabeticalPagingViewModel.vb
Index.vbhtmlCode:Imports System.Collections.Generic Imports System.Linq Imports System.Web Public Class AlphabeticalPagingViewModel Public Property Products() As List(Of ProductModel) Get Return m_ProductID End Get Set(value As List(Of ProductModel)) m_ProductID = value End Set End Property Private m_ProductID As List(Of ProductModel) Public Property FirstLetters() As List(Of String) Get Return m_FirstLetters End Get Set(value As List(Of String)) m_FirstLetters = value End Set End Property Private m_FirstLetters As List(Of String) Public Property SelectedLetter() As String Get Return m_SelectedLetter End Get Set(value As String) m_SelectedLetter = value End Set End Property Private m_SelectedLetter As String End Class
Code:@Code ViewData("Title") = "Alphabet Based Paging" End Code @ModelType MVCAlphabeticPager.AlphabeticalPagingViewModel <br /> <div class="panel panel-primary"> <div class="panel-heading panel-head">Product Listing</div> <div class="panel-body"> @Html.AlphabeticalPager(Model.SelectedLetter, Model.FirstLetters, Function(x) Url.Action("Index", New With {.selectedLetter = x})) <table class="table" style="margin: 4px"> <tr> <th> @Html.DisplayName("Product ID") </th> <th> @Html.DisplayName("Product Number") </th> <th> @Html.DisplayName("Product Name") </th> <th> @Html.DisplayName("Standard Cost") </th> <th> @Html.DisplayName("Color") </th> <th> @Html.DisplayName("Category") </th> </tr> @For Each item In Model.Products Dim currentItem = item @<tr> <td> @Html.DisplayFor(Function(modelItem) currentItem.ProductID) </td> <td> @Html.DisplayFor(Function(modelItem) currentItem.ProductNumber) </td> <td> @Html.DisplayFor(Function(modelItem) currentItem.ProductName) </td> <td> @Html.DisplayFor(Function(modelItem) currentItem.StandardCost) </td> <td> @Html.DisplayFor(Function(modelItem) currentItem.Color) </td> <td> @Html.DisplayFor(Function(modelItem) currentItem.ProductCategory) </td> </tr> Next </table> @Html.AlphabeticalPager(Model.SelectedLetter, Model.FirstLetters, Function(x) Url.Action("Index", New With {.selectedLetter = x})) </div> </div>
Browser View:
![]()


Reply With Quote