本文的效果是在 Part 62,及63 的基础上实现的。
实现效果:
1. Name 和 Gender 列必须是可点击的超链接。
2. 点击 Name 或 Header,就可以实现排序功能, 如果没有点击 Name 或 Header, 则该列的数据以升序排列,如果点击了该列,数据降序排列 。
3. 默认情况下,数据按“Name”升序排列。
步骤(在part63代码的基础上):1,将原来的Index方法的代码(如下):
public ActionResult Index(string searchBy, string search, int? page)
{
if (searchBy == "Gender")
{
return View(db.Employees.Where(x => x.Gender == search || search ==null).ToList().ToPagedList(page ?? 1, 3));
}
else
{
return View(db.Employees.Where(x => x.Name.StartsWith(search) || search ==null).ToList().ToPagedList(page ?? 1, 3));
}
}
替换成下面的代码:
public ActionResult Sort(string searchBy, string search, int? page, string sortBy)
{
ViewBag.SortNameParameter = string.IsNullOrEmpty(sortBy) ? "Name desc" : "";
ViewBag.SortGenderParameter = sortBy == "Gender" ? "Gender desc" : "Gender";
var students = db.Students.AsQueryable();
if (searchBy == "Gender")
{
students = students.Where(x => x.Gender == search || search == null);
}
else
{
students = students.Where(x => x.Name.StartsWith(search) || search == null);
}
switch(sortBy)
{
case "Name desc":
students = students.OrderByDescending(x => x.Name);
break;
case "Gender desc":
students = students.OrderByDescending(x => x.Gender);
break;
case "Gender":
students = students.OrderBy(x => x.Gender);
break;
default:
students = students.OrderBy(x => x.Name);
break;
}
return View(students.ToPagedList(page ?? 1,3));
}
2. 将原来的Index.cshtml中下面的代码:
<tr>
<th>
@Html.DisplayNameFor(model => model.First().Name)
</th>
<th>
@Html.DisplayNameFor(model => model.First().Gender)
</th>
<th>
@Html.DisplayNameFor(model => model.First().Email)
</th>
<th></th>
</tr>
用下面的代码替换:
<tr>
<th>
@Html.ActionLink("Name","Sort",new {sortBy=ViewBag.SortNameParameter, searchBy=Request.QueryString["searchBy"],search= Request.QueryString["search"] })
</th>
<th>
@Html.ActionLink("Gender", "Sort", new { sortBy = ViewBag.SortGenderParameter, searchBy = Request.QueryString["searchBy"], search = Request.QueryString["search"] })
</th>
<th>
@Html.DisplayNameFor(model => model.First().Email)
</th>
<th></th>
</tr>