上篇文章 已经做出了基本的增删改查    但这远远不足以应付实际的项目  今天讲下实际项目中 肯定会有的 排序 刷选  以及分页。 重点想多写点分页的 毕竟这个是任何时候都要有的

而且 我会尽量把这个分页做的复杂下  这样到实际项目时 可以复制过来改改就行了~~ (这里我用的是国产的基于ScottGu的PagedList<T>类和相关方法完善的分页--MVCPager)

是个开源的  带很多demo介绍的分页帮助类  这里说下 建议大家看下源码 这样才能进步 要不然只是个会使用插件的人~   在这里感谢下作者 ~~ 好了 开始先上效果图

排序刷新及其分頁

这个样式可以调~~  我的样子难看了些~~    显示当前页的索引 记录条数 还有跳转页数  等 常用分页的功能都有了

我们可以根据姓名查找  可以点击 lastName 按姓名排序  和按发布日期排序  这就是今天要做的~

一.排序

排序刷新及其分頁
public ViewResult 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.EnrollmentDate);
break;
}
return View(students.ToList());
}
排序刷新及其分頁

这乱七八糟的是什么呢  我来解释下~  接受的参数sortOrder是根据什么排序   例如http://localhost:2175/Student?sortOrder=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.EnrollmentDate);
break;
}
排序刷新及其分頁

先来说下 这不是把所有记录都查出来 然后再排序  因为这个是IQueryable 的  这个是将表达式树 翻译成SQL 最后再执行的  所以在后面的 根据条件刷选 分页 排序等 是不会有效率问题的   但是如果你把上面的students.tolist() 一下 则就是全部加载啦~~  因为不再是 IQueryable接口了~~  也就是说 他是在tolist时或者说 是在AsEnumerable才执行sql~~

好 回到例子上  因为第一次访问  sortOrder一定是空的 所以switch到  students = students.OrderBy(s => s.EnrollmentDate);  默认按时间排序

这时我们再来看这两句


ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date desc" : "Date";

viewBag  MVC3才有的   利用了.net4.0的 dynamic 特性~  其实这个和MVC2中的 viewdata使用方法差不多  我们在这里 设置  ViewBag.NameSortParm以及ViewBag.DateSortParm 是为了给view用的  一会儿看view就明白了~    上来由于sortOrder为空  所以 ViewBag.NameSortParm=Name desc   由于sortOrder 不等于Date 所以

ViewBag.DateSortParm等于 Date  

说白了  以时间排序为例  就是为了实现 点排序连接时   第一次 升序  再点就变成降序了  再点就变成升序........

不看view 怎么解释都迷糊~~ 看view

<tr>
    <th></th>
    <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>
</tr>

不明白就自己做下 动动手~~ 调试几次就明白了~

二.根据条件过滤

这里我们做的是根据姓名刷选

我们先在index视图下加个搜索框和搜索按钮

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

我们的控制器更改为

排序刷新及其分頁
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());
}
排序刷新及其分頁

相关文章: