EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页。在本教程中,您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面,并简单分组。

下面的插图显示页面当你完成时的样子。列标题是链接,用户可以单击要作为排序依据的列。单击列标题,一再升序和降序之间切换。

Students_Index_page_with_paging

将列排序链接添加到学生索引页

若要添加排序到学生索引页,会改变Student控制器的Index方法,将代码添加到Student的索引视图。

添加排序功能指数法

Controllers\StudentController.cs,用下面的代码替换该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()); }

这段代码接收sortOrder参数从 URL 中的查询字符串。由 ASP.NET MVC 作为操作方法的参数提供的查询字符串值。该参数将是"名称"日期",(可选) 其次是下划线和"desc"来指定降序排序字符串的字符串。默认的排序顺序升序。

第一次请求的索引页时,那里是没有查询字符串。学生按升序排列显示的LastName,这是默认值,秋天通过案switch语句所认定。当用户单击列标题的超链接时,在查询字符串中提供了适当sortOrder值。

两个ViewBag变量使用这样的视图可以使用适当的查询字符串值配置列标题的超链接:

ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : ""; ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";

这些都是三元的语句。第一个指定sortOrder参数为 null 或为空,是否ViewBag.NameSortParm应设置为"name_desc";否则,应将设置为空字符串。这两个语句使该视图设置列标题的超链接,如下所示:

当前排序顺序最后一个名称超链接日期的超链接
Last Name升序排列降序升序
Last Name降序升序升序
Date升序升序降序
Date降序升序升序

该方法使用LINQ to 实体来指定要作为排序依据的列。代码创建IQueryable变量switch语句之前,修改在switch语句,并ToList调用后switch语句。当您创建和修改IQueryable变量时,没有查询发送到数据库中。不执行查询,直到您将IQueryable对象转换成一个集合通过调用一种方法如ToList因此,这段代码结果中的单个查询,return View的语句之前不会被执行。

添加列标题到学生的索引视图的超链接

Views\Student\Index.cshtml,将标题行的<tr><th>元素替换突出显示的代码:

<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) {

此代码使用ViewBag属性中的信息来设置适当的查询字符串值的超链接。

运行此页,然后单击Last NameEnrollment Date的列标题,以验证该文献整理工作。

Students_Index_page_with_sort_hyperlinks

单击姓氏标题后,学生是降序显示最后一个名称。

向学生索引页添加一个搜索框

若要添加筛选到学生索引页,将会向视图中添加一个文本框和一个提交按钮和Index方法中做相应的修改。文本框中会让你输入名字和姓氏字段中搜索的字符串。

将筛选功能添加到索引方法

Controllers\StudentController.cs,用下面的代码 (突出显示所做的更改) 来替换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()); }

您已经添加到Index方法的searchString参数。您已经添加在 LINQ 语句whereclausethat 选择只有其名字或姓氏包含搜索字符串的学生。搜索字符串值被收到一个文本框,您将添加到索引视图。 添加where子句的语句执行只有在要搜索的值。

在许多情况下你可以调用同一个方法,在实体框架的实体集或作为一种对内存中集合的扩展方法。结果通常都是一样,但在某些情况下可能会有所不同。例如,Contains方法的.NET 框架实现返回的所有行时将为空字符串传递给它,但 SQL Server 紧凑 4.0 的实体框架提供程序都返回零行空字符串。因此 (放Whereif语句的语句) 的示例中的代码将确保你得到相同的结果,所有版本的 SQL Server。而且在此基础上, Contains方法的.NET 框架实现默认情况下,执行区分大小写的比较,实体框架 SQL Server 提供程序在默认情况下执行不区分大小写的比较。因此,调用ToUpper方法使测试明确不区分大小写可以确保当您更改以后要使用的存储库,它将返回而不是IQueryable对象IEnumerable集合的代码结果不会改变。(当Contains调用对IEnumerable集合时,你得到的.NET 框架实现 ; 当你对IQueryable对象调用它,你得到的数据库提供程序实现。

学生的索引视图中添加一个搜索框

Views\Student\Index.cshtml,添加突出显示的代码之前开放table标记以创建一个标题、 一个文本框和搜索按钮。

<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>
 

运行该页面,输入搜索字符串,单击搜索筛选验证正常工作。

Students_Index_page_with_search_box

请注意 URL 不包含"一个"搜索字符串,这意味着如果用书签标记此页,你不会得到筛选后的列表,当您使用该书签。您将更改搜索按钮,稍后在本教程中使用查询字符串进行筛选条件。

将分页添加到学生index页

要向学生索引页添加分页,你会开始通过安装PagedList.Mvc NuGet 程序包。然后你会在Index法进行其他更改和添加分页链接到Index视图。PagedList.Mvc是一个多好的分页和排序包为 ASP.NET MVC 中,和它的使用在这里仅用作示例,不是为它在其他选项的建议。下面的插图显示分页链接。

Students_index_page_with_paging

安装 PagedList.MVC NuGet 程序包

NuGet PagedList.Mvc包自动安装PagedList软件包,作为一种依赖。PagedList程序包安装IQueryableIEnumerable收藏PagedList集合类型和扩展方法。扩展方法在您IQueryableIEnumerable, PagedList集合中创建单个数据页和PagedList集合提供了若干属性和便利分页的方法。PagedList.Mvc包安装一个分页的助手显示分页按钮。

工具菜单中,选择库程序包管理器,然后管理 NuGet 程序包的解决方案.

管理 NuGet 程序包对话框中,单击联机选项卡在左边,然后在搜索框中输入"paged"。当你看到PagedList.Mvc包时,单击安装.

选择项目框中,单击确定.

将分页功能添加到索引方法

Controllers\StudentController.cs,添加PagedList命名空间的using语句:

using PagedList;

用下面的代码来替换Index方法:

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 

转载于:https://www.cnblogs.com/178mz/p/4262358.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…

Hadoop总结

目录 大数据概述 Hadoop大数据开发平台 资源管理YARN 分布式文件系统HDFS 非关系型数据库NOSQL 分布式数据库HBASE 批处理和MapReduce 数据仓库查询分析和Hive 基于内存计算的Spark 流计算和Flink 图计算和PREGEL Hadoop常用命令总结 大数据概述 大数据的4V&#x…

HDFS的常用操作

1、HDFS文件的权限以及读写操作 HDFS文件的权限&#xff1a; •与Linux文件权限类似 •r: read; w:write; x:execute&#xff0c;权限x对于文件忽略&#xff0c;对于文件夹表示是否允许访问其内容 •如果Linux系统用户zhangsan使用hadoop命令创建一个文件&#xff0c;那么这个文…

并行计算总结

作者&#xff1a;ArimaMisaki 目录 1 并行计算概述. 2 1.1 基本概念. 2 1.2 存储器的层次结构. 3 1.3 并行计算. 3 1.4 动态互连网络. 4 1.5 并行计算机结构模型. 5 1.6 并行算法的基本设计策略. 6 1.7 并行编程风范. 6 1.8 单核多线程和并发执行. 7 1.9 拓展&#x…

基础总结篇之中的一个:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;能够為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就全然掌握&#xff0c;那基本不大可能&#xff0c;所以我们须要常常回过头再细致研读几遍&#xff0c;以领悟到作者的思想精…

数据结构杂谈(九)——二叉树的遍历

9 二叉树的遍历 文章目录9 二叉树的遍历9.1 递归函数基础9.2 深度优先遍历的实现9.3 二叉树层次遍历9.1 递归函数基础 什么是递归&#xff1f;调用自身就是叫递归&#xff0c;如下所示&#xff1a; void r(){r(); }我们习惯借用阶梯图来帮助我们理解这些知识。如果是同一层函数…

洛谷 P3750 [六省联考2017]分手是祝愿

传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> const int N100000,mod100003; #define For(i,a,b)…

解决 error: command 'swig' failed with exit status 1

2019独角兽企业重金招聘Python工程师标准>>> # pip install docker-registry 分析&#xff1a;观察出现的错误&#xff0c;发现最开始报错的地方提示不能找到openssl的.h头文件。一般.h头文件都是放到/usr/inclue目录下的&#xff0c;而且头文件所在的安装包一般叫…

Android安全-SO动态库注入

2019独角兽企业重金招聘Python工程师标准>>> 关于这方面技术&#xff0c;网上已经有大把的实现。在此&#xff0c;我只是记录下自己的学习过程。 0x1 原理 所谓的SO注入就是将代码拷贝到目标进程中&#xff0c;并结合函数重定向等其他技术&#xff0c;最终达到监控或…

BUG日志-2022.7.12——关于VSCode感叹号无法生成HTML骨架问题

解决办法&#xff1a;放弃使用多年的!&#xff0c;而采用html:5的形式。 原因&#xff1a;好像是因为VScode已经更新了 好多扩展也失效了。

hadoop 入门实例【转】

原文链接&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1、数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据…

AWS安装CDH5.3-CentOS6.4中关键操作步骤

1、在AWS masternode 上下载cloudera-manager-installer.bin安装包 [rootip-172-21-42-114 ~]# wget http://archive.cloudera.com/cm5/installer/latest/coludera-manager-installer.bin 此时会提示&#xff1a;-bash: wget: command not find 所以要现安装wget命令 [rootip-1…

You have an error in your SQL syntax; check the manual that corresponds to...

问题缘由&#xff1a; 使用datagrip插入数据时发生报错 使用插入语句为&#xff1a; insert into ev_name (‘username’,‘password’) values (‘admin’,‘123456’); 错误提示&#xff1a; You have an error in your SQL syntax; check the manual that corresponds to …

getaddrinfo ENOTFOUND 127.0.0.1:3306

错误缘由&#xff1a; 在写nodejs项目时&#xff0c;连接数据库发现找不到数据库。 解决&#xff1a; 发现数据库连接池没有设置端口号&#xff0c;需设置端口号3306。 解决效果&#xff1a; 成功解决

一幅长文细学node.js——一幅长文系列

文章目录1 Node.js概述1.1 初识Node.js1.2 Node.js简介1.3 Node.js安装1.4 使用Node.js运行JS代码2 fs文件系统模块2.1 读取文件2.2 写入文件2.3 路径问题3 Path路径模块3.1 Path模块概述3.2 路径拼接3.3 获取路径的文件名4 Http模块4.1 Http概述4.2 服务器相关的概念4.3 创建W…

一幅长文细学GaussDB(一)——数据库介绍

文章目录1 数据库介绍1.1 数据库技术1.2 数据库技术发展史数据库技术产生和发展数据库三个阶段比较数据库系统优势层次模型网状模型关系模型关系数据库产品历史结构化查询语言SQL面向对象数据模型&#xff08;OO模型&#xff09;数据管理技术的新挑战NoSQL技术特点和类型主要No…

Unity 通过Unity Admob Plugin插件集成admob教程

原创&#xff1a;officemaster.cn下载Unity Admob Demo&#xff0c;插件里面包含Admob_Unity_Demo.unitypackage 插件文件AdmobPluginRes 是Admob 的ios sdk和插件使用样例代码打开样例代码可以看到代码里面如何使用Unity Admob插件把Admob Unity插件添加进unity工程1. 打开Un…

一幅长文细学华为MRS大数据开发(一)——大数据时代的挑战和机遇

文章目录1 大数据时代的挑战和机遇1.1 大数据基础概念大数据时代的发展大数据定义大数据的4V大数据处理和传统数据处理的差异并行计算相关知识1.2 大数据应用领域大数据金融应用大数据教育应用大数据公共安全应用大数据交通规划应用1.3 大数据计算计算任务的分类大数据应用的主…

一幅长文细学华为MRS大数据开发(二)——HDFS分布式文件系统和ZooKeeper

文章目录2 HDFS分布式文件系统和ZooKeeper2.1 HDFS概述以及应用场景HDFS概述HDFS应用场景HDFS不适合的场景2.2 HDFS相关概念计算机集群结构基本系统架构块NameNode和DataNodes2.3 HDFS体系架构HDFS体系架构概述HDFS命名空间管理通信协议客户端HDFS单名称节点体系结构的局限性心…