MVC3+EF4.1学习系列(三)-----排序 刷选 以及分页
上篇文章 已经做出了基本的增删改查 但这远远不足以应付实际的项目 今天讲下实际项目中 肯定会有的 排序 刷选 以及分页。 重点想多写点分页的 毕竟这个是任何时候都要有的
而且 我会尽量把这个分页做的复杂下 这样到实际项目时 可以复制过来改改就行了~~ (这里我用的是国产的基于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")
<input type="submit" value="Search" /></p>
}
我们的控制器更改为
Index方法多了个参数 SearchSring 这个参数名字是和 Html.TextBox 里的name对应着的
并且增加如下代码
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
|| s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
}
查看姓名里是否含有要搜索的
这样 条件过滤就完成了
但是有个小问题 我们一般搜索完 文本框保留搜索内容 而不是没了 所以这里需要再次借用ViewBag.Filter = searchString; 保存下值
然后视图改为
<p>Find by Name @Html.TextBox("searchString", ViewBag.Filter as string)</p>
好了 这样搜索就完了~~接下来 最重要的分页
三.分页
接下来是讲MVCPager
首先 下去下载例子以及DLL 这里有个问题 就是下载的dll和mvc3不是很兼容 让我纠结了很久 要去下载mvc3的实例 然后把里面的 一个叫做MvcPager的dll找到 添加这个引用就OK了
然后我们打开view下的config 添加命名空间 这样可以让你的view都有这个命名空间了~

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="Webdiyer.WebControls.Mvc"/><!--添加这个 -->
</namespaces>
</pages>
</system.web.webPages.razor>

改造我们的控制器 如下
要记得 pageIndex 从1开始 1表示第一页
只需简单的返回
int pageSize = 2;
int pageIndex = page ?? 1;
return View(students.ToPagedList(pageIndex, pageSize));
这样就OK了 就这么简单~~
视图的model 改为 @model PagedList<ContosoUniversity.Models.Student>
然后分页的视图为
<p>共有 @Model.TotalItemCount 条记录 @Model.CurrentPageIndex/@Model.TotalPageCount</p>
@Html.Pager(Model, new PagerOptions { PageIndexParameterName = "page", ShowPageIndexBox = true, PageIndexBoxType = PageIndexBoxType.TextBox, PageIndexBoxWrapperFormatString = "请输入页数{0}" }, "Default", new { sortOrder = ViewBag.DateSortParm, searchString = ViewBag.Filter })
看 一个要显示复杂的分页 就这么简单的完成了
大家一定和我一样 关心生成的SQL语句怎么样 是否靠谱 效率可以么 让我们监控一下生成的SQL语句吧
这是通过跟踪得到的SQL

SELECT TOP (2)
[Extent1].[StudentID] AS [StudentID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstMidName] AS [FirstMidName],
[Extent1].[EnrollmentDate] AS [EnrollmentDate]
FROM ( SELECT [Extent1].[StudentID] AS [StudentID], [Extent1].[LastName] AS [LastName], [Extent1].[FirstMidName] AS [FirstMidName], [Extent1].[EnrollmentDate] AS [EnrollmentDate], row_number() OVER (ORDER BY [Extent1].[EnrollmentDate] ASC) AS [row_number]
FROM [dbo].[Student] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 2
ORDER BY [Extent1].[EnrollmentDate] ASC

利用 row_number() 实现的分页 ~~
好了 分页OK了
四.总结
基本的EF操作OK了 合理利用第三方插件 大大提高了开发效率 学会借用 但也要知道原理
EF做为ORM 框架 就是要处理关系 前面这几篇 都是简单的操作 没有设计关系
下篇讲ORM的关系的处理 不仅是EF ORM框架都会遇到的 关系的处理 以及 多对多关系表里还需要其他字段时的处理
转载 请保留连接~~
MVC3+EF4.1学习系列(三)-----排序 刷选 以及分页的更多相关文章
- MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化
上篇文章中 我们已经创建了EF4.1基于code first的例子 有了数据库 并初始化了一些数据 今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...
- MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决
博客写了10篇了~有很多朋友私信问了一些问题,而且很多问题 大家问的都一样 这里说说这些常见问题的解决办法.如果大家有更好的解决办法~也希望分享出来 问题大概为这几个 一.ef4.1 codeFirs ...
- MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例
基于EF4.1 code first 简单的CRUD 园子中已经有很多了 ~~ 真不想再写这个了 可是为了做一个完整的小demo 从开始 到后面的一些简单重构 还是决定认真把这个写出来 争取写些别人 ...
- MVC3+EF4.1学习系列(五)----- EF查找导航属性的几种方式
文章索引和简介 通过上一篇的学习 我们把demo的各种关系终于搭建里起来 以及处理好了如何映射到数据库等问题 但是 只是搭建好了关系 问题还远没有解决 这篇就来写如何查找导航属性 和查找导航属性的几种 ...
- MVC3+EF4.1学习系列(九)-----EF4.1其他的一些技巧的使用
上节通过一系列重构 简单的项目就实现了 不过还有些EF的功能没有讲 这节就通过项目 讲讲EF其他的功能与技巧 一.直接执行SQL语句 通常来讲 EF 不用写SQL语句的 但是 在有些场合 比如对生 ...
- MVC3+EF4.1学习系列(十)----MVC+EF处理树形结构
通过前几篇文章 我们处理了 一对一, 一对多,多对多关系 很好的发挥了ORM框架的做用 但是 少说了一种 树形结构的处理, 而这种树形关系 我们也经常遇到,常见的N级类别的处理, 以及经常有数据与类别 ...
- MVC3+EF4.1学习系列(七)-----EF并发的处理
看这篇文章之前 推荐园子里的 这个文章已经有介绍了 而且写的很好~~ 可以先看下他的 再看我的 并发 1.悲观并发 简单的说 就是一个用户访问一条数据时 则把这个数据变为只读属性 把该数据变为独占 ...
- MVC3+EF4.1学习系列(八)-----利用Repository and Unit of Work重构项目
项目最基础的东西已经结束了,但是现在我们的项目还不健全 不利于测试 重复性代码多 层与层之间耦合性高 不利于扩展等问题.今天的这章 主要就是解决这些问题的.再解决这些问题时,自己也产生了很多疑 ...
- MVC3+EF4.1学习系列(六)-----导航属性数据更新的处理
通过上一篇的学习 我们已经知道怎么查询关系 这篇就来说说怎么导航属性数据更新时的处理 以及EF又会为我们生成哪些SQL~ 老规矩 先看下今天的图 添加和修改页面基本就是这样 这节的内容相对简单~~ 主 ...
随机推荐
- Amabri添加YDB报错
点部署直接出现如下图: 通过查看日志: tail -f /var/log/ambari-server/ambari-server.log java.lang.RuntimeException: Una ...
- mac下 使用 versions版本控制工具 修复游戏bug过程
1,首先拥有游戏源代码文件,修复bug之前先使用versions工具进行更新: 2,查找指定的bug之前,先运行游戏,在源代码中觉得是bug的地方打个断点,然后运行游戏的对应有bug的地方,看是否会有 ...
- 今天学习的裸板驱动之存储控制器心得(初始化SDRAM)
CPU只管操作地址,而有些地址代表的是某些存储设备. 但是操作这些存储设备需要很多东西,比如需要制定bank,行/列地址等.所以就有了存储管理器,用来处理这种CPU操作的地址和存储设备间的转换. (1 ...
- JUnit——(二)注解
1. 两种错误:Error和Failure Error是代码错误 @Test publicvoid testAdd() { int z=new T().add(5,3); assertEquals(8 ...
- js注入 mooc
javascript:(function(){try{var a=document.createElement('SCRIPT');a.type='text/javascript',a.src='// ...
- Python学习笔记——基础篇【第五周】——常用模块学习
模块介绍 本节大纲: 模块介绍 time &datetime模块 (时间模块) random (随机数模块) os (系统交互模块) sys shutil (文件拷贝模块) j ...
- 构建maven的web项目时注意的问题
构建项目后或者导入项目后,我们需要bulid path--->config build path 特别是maven的依赖一定要 发布到WEB_INF的lib下面,不然在发布项目的时候,这些依赖都 ...
- Topself 方便调试的Window服务框架
Installing Topshelf nuget Install-Package Topshelf public class TownCrier { readonly Timer _timer; p ...
- Yii 2 修改 URL 模式为 PATH 模式,并隐藏index.php
在弄yii的url重写,希望能把url改成更好记的形式,同时去掉index.php的部分.转化前后的对比:修改前: http://localhost/index.php?r=site/page?vie ...
- IIS优化服务器性能导致QuartZ任务未运行
问题: IIS 为优化服务器性能,会自动对它认为休眠的应用程序进行资源回收,资源回收将会导致网站应用程序关闭. 解决方案: 1. 设置闲置超时为0,固定回收时间间隔为0,即IIS不主动回收闲置进程 ...