The following is my data table in design mode from which I am showing a record in a MVC 4 application:
Image 1.
- CREATE TABLE [dbo].[Employee](
- [Emp_ID] [int] IDENTITY(1,1) NOT NULL,
- [Name] [varchar](50) NULL,
- [Email] [varchar](500) NULL,
- [Designation] [varchar](50) NULL,
- [City] [varchar](50) NULL,
- [State] [varchar](50) NULL,
- [Country] [varchar](50) NULL,
- CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED
- (
- [Emp_ID] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY]
- GO

Image 2.
Now create a new MVC 4 application using Visual Studio as in the following:

Image 3.
Select Internet application.
Now right-click on your project in Solution Explorer then select Manage NuGet Packages.

Image 4.

Image 5.

Image 6.
Now again right-click on your project in Solution Explorer then click on ADD New ADO.NET Entity Data Model.

Image 7.

Image 8.

Image 9.

Image 10.

Image 11.

Image 12.

Image 13.
Now add a new Controller Name as Employee as in the following:
Image 14.
Place the following code in Employee Controller:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using PagedList;
- namespace pagingNSortingInMVC4.Controllers
- {
- public class EmployeeController : Controller
- {
- //
- // GET: /Employee/
- EmployeeManagementEntities obj;
- public EmployeeController()
- {
- obj = new EmployeeManagementEntities();
- }
- public ActionResult Index(string sortOrder, string CurrentSort, int? page)
- {
- int pageSize = 5;
- int pageIndex = 1;
- pageIndex = page.HasValue ? Convert.ToInt32(page) : 1;
- ViewBag.CurrentSort = sortOrder;
- sortOrder = String.IsNullOrEmpty(sortOrder) ? "Emp_ID" : sortOrder;
- IPagedList<Employee> emp = null;
- switch (sortOrder)
- {
- case "Emp_ID":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.Emp_ID).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.Emp_ID).ToPagedList(pageIndex, pageSize);
- break;
- case "Emp_Name":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.Name).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.Name).ToPagedList(pageIndex, pageSize);
- break;
- case "Email":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.Email).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.Email).ToPagedList(pageIndex, pageSize);
- break;
- case "Designation":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.Designation).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.Designation).ToPagedList(pageIndex, pageSize);
- break;
- case "City":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.City).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.City).ToPagedList(pageIndex, pageSize);
- break;
- case "State":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.State).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.State).ToPagedList(pageIndex, pageSize);
- break;
- case "Country":
- if (sortOrder.Equals(CurrentSort))
- emp = obj.Employee.OrderByDescending
- (m => m.Country).ToPagedList(pageIndex, pageSize);
- else
- emp = obj.Employee.OrderBy
- (m => m.Country).ToPagedList(pageIndex, pageSize);
- break;
- case "Default":
- emp = obj.Employee.OrderBy
- (m => m.Emp_ID).ToPagedList(pageIndex, pageSize);
- break;
- }
- return View(emp);
- }
- }
- }

Image 15.
Place the following code in Index.cshtml:
- @model PagedList.IPagedList<pagingNSortingInMVC4.Employee>
- @using PagedList.Mvc;
- @{
- ViewBag.Title = "Employee List";
- Layout = "~/Views/Shared/_Layout.cshtml";
- }
- <h2>Employee List</h2>
- @using (Html.BeginForm())
- {
- <table>
- <tr>
- <th style="border: 2px solid black; text-align: center; width: 12%">
- @Html.ActionLink("Employee ID", "Index",
- new { sortOrder = "Emp_ID", CurrentSort = ViewBag.CurrentSort })
- </th>
- <th style="border: 2px solid black; text-align: center; width: 25%">
- @Html.ActionLink("Employee Name", "Index",
- new { sortOrder = "Emp_Name", CurrentSort = ViewBag.CurrentSort })
- </th>
- <th style="border: 2px solid black; text-align: center; width: 15%;">
- @Html.ActionLink("Email", "Index",
- new { sortOrder = "Email", CurrentSort = ViewBag.CurrentSort })
- </th>
- <th style="border: 2px solid black; text-align: center; width: 10%;">
- @Html.ActionLink("Designation", "Index",
- new { sortOrder = "Designation", CurrentSort = ViewBag.CurrentSort })
- </th>
- <th style="border: 2px solid black; text-align: center; width: 10%;">
- @Html.ActionLink("City", "Index",
- new { sortOrder = "City", CurrentSort = ViewBag.CurrentSort })
- </th>
- <th style="border: 2px solid black; text-align: center; width: 10%;">
- @Html.ActionLink("State", "Index",
- new { sortOrder = "State", CurrentSort = ViewBag.CurrentSort })
- </th>
- <th style="border: 2px solid black; text-align: center; width: 10%;">
- @Html.ActionLink("Country", "Index",
- new { sortOrder = "Country", CurrentSort = ViewBag.CurrentSort })
- </th>
- </tr>
- @foreach (var item in Model)
- {
- <tr>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.Emp_ID)
- </td>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.Name)
- </td>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.Email)
- </td>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.Designation)
- </td>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.City)
- </td>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.State)
- </td>
- <td style="border: 2px solid black; text-align: center; word-wrap: break-word;">
- @Html.DisplayFor(modelItem => item.Country)
- </td>
- </tr>
- }
- </table>
- <br />
- <div id='Paging' style="text-align: center">
- Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
- of @Model.PageCount
- @Html.PagedListPager(Model, page => Url.Action("Index", new { page }))
- </div>
- }

Image 16.
Now do paging:

Image 17.
Now do sorting:

Image 18.

Image 19.

Image 20.

Arvind SinghPosted May 3, 2017, 8:01 AM
Good one. but how to work??
Srinivas RaoPosted Dec 8, 2016, 4:09 AM
Hi, I have a @Html.Grid with 7 columns. Applied paging and Sortable(true). Everything looks proper. The problem is when i click on any column of the grid, only current page column entries are sorted [Example only 15 entries displayed in the 1st page are sorted]. Can you please suggest how to sort all entries in all pages corresponding to the clicked column. Srinivas
Moin uddinPosted Feb 16, 2016, 12:04 PM
Nice artical
Rahul Kumar SaxenaPosted Mar 11, 2015, 2:03 PM
Thank u Gowtham Rajamanickam
Gowtham RajamanickamPosted Mar 11, 2015, 9:50 AM
good one....
Rahul Kumar SaxenaPosted Feb 24, 2015, 1:17 PM
welcome Sreenivasa K...
sreenivasa kPosted Feb 24, 2015, 12:38 PM
Thx to Rahul Ji
Rahul Kumar SaxenaPosted Feb 24, 2015, 6:45 AM
Thanks Ramchand...
Rahul Kumar SaxenaPosted Feb 24, 2015, 6:45 AM
Thanks Joginder Banger...
Ramchand RepallePosted Feb 24, 2015, 6:22 AM
good one..!!
Joginder BangerPosted Feb 24, 2015, 2:17 AM
nice one sir
Harpreet SinghPosted Feb 24, 2015, 2:16 AM
nice one...very helpful