一、添加列标题排序功能
我们将增加Student/Index页面的功能,为列标题添加超链接,用户可以点击列标题对那一列进行排序。
1.修改Index方法
public ActionResult Index(string sortOrder){ ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date"; var students = from s in db.Students select s; switch (sortOrder) { case "Name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "Date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: students = students.OrderBy(s => s.LastName); break; } return View(students.ToList());}
第一次Index页面响应的时候,没有query string,学生按照LastName升序排序,这是?:表达式的默认值,switch 语句执行升序操作。当用户点击列标题的超链接,正确的sortOrder参数传给query string。
两个ViewBag变量用来区分列标题的超链接,是选择哪一个query string。
2.在Student\Index视图中,添加列标题超链接
@Html.ActionLink("Create New", "Create")
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm }) | First Name | @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm }) |
---|
运行验证效果。
二、添加一个搜索文本框
添加一个按照first name、last name搜索的文本框,实现对数据的过滤。
1.Index方法中添加过滤功能
public ViewResult Index(string sortOrder, string searchString){ ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; var students = from s in db.Students select s; if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); } switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: students = students.OrderBy(s => s.LastName); break; } return View(students.ToList());}
2.在Index视图中添加Search文本框
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm()){Find by name: @Html.TextBox("SearchString")
}
运行查看效果。
细心的同学有没有发现神马问题?搜索和排序功能同时能用么?
三、添加分页功能
我们将使用PagedList.Mvc NuGet包,实现分页功能。
1.安装PagedList.MVC NuGet Package
PagedList包安装了一个PagedList集合类型,并且扩展方法适用于IQueryable和IEnumerable集合。
2.为Index方法添加分页功能
using PagedList;
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page){ ViewBag.CurrentSort = sortOrder; ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; if (searchString != null) { page = 1; } else { searchString = currentFilter; } ViewBag.CurrentFilter = searchString; var students = from s in db.Students select s; if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); } switch (sortOrder) { case "name_desc": students = students.OrderByDescending(s => s.LastName); break; case "Date": students = students.OrderBy(s => s.EnrollmentDate); break; case "date_desc": students = students.OrderByDescending(s => s.EnrollmentDate); break; default: // Name ascending students = students.OrderBy(s => s.LastName); break; } int pageSize = 3; int pageNumber = (page ?? 1); return View(students.ToPagedList(pageNumber, pageSize));}
3.在Student\Index视图,添加页码链接
@model PagedList.IPagedList@using PagedList.Mvc; @{ ViewBag.Title = "Students";} Students
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("Index", "Student", FormMethod.Get)){Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
}Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount@Html.PagedListPager( Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter }) )
@foreach (var item in Model) { @Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter }) First Name @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter }) } @Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) | @Html.ActionLink("Details", "Details", new { id=item.StudentID }) | @Html.ActionLink("Delete", "Delete", new { id=item.StudentID }) @Html.DisplayFor(modelItem => item.LastName) @Html.DisplayFor(modelItem => item.FirstMidName) @Html.DisplayFor(modelItem => item.EnrollmentDate)
你可以使用PagedListPager帮助器定制自己的分页效果,包括URLs和样式,查看更多信息请点击 on the GitHub site。
@Html.TextBox("SearchString", ViewBag.CurrentFilter as string) 中,ViewBag的值绑定都SearchString文本框上。
四、创建学生数据分析页面
在About页面中,我们将显示每天有多少学生注册。
1.创建视图模型
using System;using System.ComponentModel.DataAnnotations;namespace ContosoUniversity.ViewModels{ public class EnrollmentDateGroup { [DataType(DataType.Date)] public DateTime? EnrollmentDate { get; set; } public int StudentCount { get; set; } }}
2.修改Home控制器
using ContosoUniversity.DAL;using ContosoUniversity.ViewModels;
public class HomeController : Controller { private SchoolContext db = new SchoolContext();
public ActionResult About(){ var data = from student in db.Students group student by student.EnrollmentDate into dateGroup select new EnrollmentDateGroup() { EnrollmentDate = dateGroup.Key, StudentCount = dateGroup.Count() }; return View(data);}
protected override void Dispose(bool disposing){ db.Dispose(); base.Dispose(disposing);}
3.修改About视图
@model IEnumerable@{ ViewBag.Title = "Student Body Statistics";} Student Body Statistics
@foreach (var item in Model) { Enrollment Date Students } @Html.DisplayFor(modelItem => item.EnrollmentDate) @item.StudentCount