演练5-2:Contoso大学校园管理2

时间:2022-12-15 19:53:46

一、添加列标题排序功能

      我们将增加Student/Index页面的功能,为列标题添加超链接,用户可以点击列标题对那一列进行排序。

演练5-2:Contoso大学校园管理2

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视图中,添加列标题超链接

<p>
@Html.ActionLink(
"Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm })
</th>
<th>First Name
</th>
<th>
@Html.ActionLink(
"Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm })
</th>
<th></th>
</tr>


@foreach (
var item in Model)
{

       运行验证效果。

二、添加一个搜索文本框

      添加一个按照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文本框

<p>
@Html.ActionLink(
"Create New", "Create")
</p>

@using (Html.BeginForm())
{
<p>
Find by name: @Html.TextBox(
"SearchString")
<input type="submit" value="Search" /></p>
}

<table>
<tr>

      运行查看效果。
演练5-2:Contoso大学校园管理2

      细心的同学有没有发现神马问题?搜索和排序功能同时能用么?

 三、添加分页功能

      我们将使用PagedList.Mvc NuGet包,实现分页功能。

演练5-2:Contoso大学校园管理2

1.安装PagedList.MVC NuGet Package

      PagedList包安装了一个PagedList集合类型,并且扩展方法适用于IQueryable和IEnumerable集合。

演练5-2:Contoso大学校园管理2

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<ContosoUniversity.Models.Student>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />

@{
ViewBag.Title
= "Students";
}

<h2>Students</h2>

<p>
@Html.ActionLink(
"Create New", "Create")
</p>
@using (Html.BeginForm(
"Index", "Student", FormMethod.Get))
{
<p>
Find by name: @Html.TextBox(
"SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
</p>
}
<table>
<tr>
<th></th>
<th>
@Html.ActionLink(
"Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th>
First Name
</th>
<th>
@Html.ActionLink(
"Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
</tr>

@foreach (
var item in Model) {
<tr>
<td>
@Html.ActionLink(
"Edit", "Edit", new { id=item.StudentID }) |
@Html.ActionLink(
"Details", "Details", new { id=item.StudentID }) |
@Html.ActionLink(
"Delete", "Delete", new { id=item.StudentID })
</td>
<td>
@Html.DisplayFor(modelItem
=> item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem
=> item.FirstMidName)
</td>
<td>
@Html.DisplayFor(modelItem
=> item.EnrollmentDate)
</td>
</tr>
}

</table>
<br />
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 }) )

      你可以使用PagedListPager帮助器定制自己的分页效果,包括URLs和样式,查看更多信息请点击TroyGoode  / PagedList on the GitHub site。

      @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)  中,ViewBag的值绑定都SearchString文本框上。

四、创建学生数据分析页面

      在About页面中,我们将显示每天有多少学生注册。

演练5-2:Contoso大学校园管理2

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<ContosoUniversity.ViewModels.EnrollmentDateGroup>

@{
ViewBag.Title
= "Student Body Statistics";
}

<h2>Student Body Statistics</h2>

<table>
<tr>
<th>
Enrollment Date
</th>
<th>
Students
</th>
</tr>

@foreach (
var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem
=> item.EnrollmentDate)
</td>
<td>
@item.StudentCount
</td>
</tr>
}
</table>