MVC5 + EF6 + Bootstrap3 (11) 实现排序、搜索、分页
前言
本节我们向这个页面中加入排序、搜索和分页功能。
排序
从上图中的地址栏中可以看到这个页面调用的是company controller下的index action.因此我们就先打开controllers文件夹下的companycontroller.cs文件,写入如下代码:
using system.linq; using system.web.mvc; using slarkinc.dal; using system; namespace slarkinc.controllers { public class companycontroller : controller { private companycontext db = new companycontext(); public viewresult index(string sortorder) { viewbag.firstnamesortparm = string.isnullorempty(sortorder) ? "first_desc" : ""; viewbag.lastnamesortparm = sortorder == "last" ? "last_desc" : "last"; var workers = from w in db.workers select w; switch (sortorder) { case "first_desc": workers = workers.orderbydescending(w => w.firstname); break; case "last_desc": workers = workers.orderbydescending(w => w.lastname); break; case "last": workers = workers.orderby(w => w.lastname); break; default: workers = workers.orderby(w => w.firstname); break; } return view(workers.tolist()); } } }
第11行,index action 的参数sortorder用来传递给controller排序的信息。sortorder有4个可能值。这4个值体现在17到31行的switch..case语句中。如果是first_desc则对firstname用orderbydescending倒序排列。如果是last_desc则对lastname倒序排列。如果是last则对lastname用orderby函数顺序排列。如果是空则对firstname顺序排列。第13-14行用viewbag存储当前排列的相反排列字符串,用于在view中生成链接。第15-16行,用linq to entity 从数据库中选取要排序的数据。第32行将排序好的数据以list的形式传递给view。
在对应的view文件~\views\company\index.cshtml中,修改其表头部分,代码如下。
<tr> <th> @html.actionlink("first name", "index", new { sortorder = viewbag.firstnamesortparm }) </th> <th> @html.actionlink("last name", "index", new { sortorder = viewbag.lastnamesortparm }) </th> <th>@html.displaynamefor(model => model.sex)</th> <th>@html.displaynamefor(model => model.rating)</th> </tr>
黄色的部分为修改后的代码。我们把以前纯文本的表头改成一个超链接,链接的参数从viewbag中获得。点击链接可以获得与当前排序相反的排序效果。
通过浏览器查看此页面。之后点击lastname链接,则按照上面代码会生成如下页面:
参数sortorder为last则这个表按lastname顺序排列。
搜索
一般查询页面都会有搜索功能帮助我们查看自己想要的页面。下面我们就来实现这个功能。
还是从controller开始,index action的代码写成如下形式:
public viewresult index(string sortorder, string searchstring) { viewbag.firstnamesortparm = string.isnullorempty(sortorder) ? "first_desc" : ""; viewbag.lastnamesortparm = sortorder == "last" ? "last_desc" : "last"; var workers = from w in db.workers select w; if (!string.isnullorempty(searchstring)) { workers = workers.where(w => w.firstname.contains(searchstring) || w.lastname.contains(searchstring)); } switch (sortorder) { case "first_desc": workers = workers.orderbydescending(w => w.firstname); break; case "last_desc": workers = workers.orderbydescending(w => w.lastname); break; case "last": workers = workers.orderby(w => w.lastname); break; default: workers = workers.orderby(w => w.firstname); break; } return view(workers.tolist()); }
上面代码中黄色的部分就是我们所添加的。第1行,searchstring向controller传递用来搜索的字符串。第7行,字符串不为空时执行搜索。这里的搜索用到了linq里的where函数,它通过一个lambda表达式来筛选出符合条件的数据。这个条件就是9-10行的"或"连接的两个contains函数。contains函数表示其所属字符串是否包含其参数字符串。整个筛选条件表示返回所有fisrtname或lastname包含筛选字符串的记录。
下面看~\views\company\index.cshtml的改动:
@using(html.beginform()) { <p> find by name: @html.textbox("searchstring","", new { @class = "form-control", @style = "display:inline" }) @html.submit("submit") </p> }
在table的上面加入这些代码,它是一个form,包含一个输入框和提交按钮,这个form会把输入框中的搜索字符串提交给当前controller完成搜索操作。其中的输入框,加入了class和style对其进行了bootstrap美化。
通过浏览器查看这个页面,在搜索框中输入b并且提交,之后会出现如下页面:
可以看到搜索结果是firstname或lastname包含b(不分大小写),的所有记录。
分页
数据查询免不了要分页。这里我们用一个名为pagedlist的插件来实现这个功能。
如下所示,在菜单栏里选择工具->库程序包管理->程序包管理控制台。
之后会在visual studio窗口的下面看到一个程序包管理控制台窗口。在其中输入install-package pagedlist.mvc。pagedlist就会自动安装到项目中。窗口如下所示。
paged list 安装好后,我们就开始修改代码,从controller开始:
using system.linq; using system.web.mvc; using slarkinc.dal; using system; using pagedlist; namespace slarkinc.controllers { public class companycontroller : controller { private companycontext db = new companycontext(); public viewresult index(string sortorder, string searchstring, string currentfilter, int? page) { viewbag.currentsort = sortorder; viewbag.firstnamesortparm = string.isnullorempty(sortorder) ? "first_desc" : ""; viewbag.lastnamesortparm = sortorder == "last" ? "last_desc" : "last"; if(searchstring != null) { page = 1; } else { searchstring = currentfilter; } viewbag.currentfilter = searchstring; var workers = from w in db.workers select w; if (!string.isnullorempty(searchstring)) { workers = workers.where(w => w.firstname.contains(searchstring) || w.lastname.contains(searchstring)); } switch (sortorder) { case "first_desc": workers = workers.orderbydescending(w => w.firstname); break; case "last_desc": workers = workers.orderbydescending(w => w.lastname); break; case "last": workers = workers.orderby(w => w.lastname); break; default: workers = workers.orderby(w => w.firstname); break; } int pagesize = 3; int pagenumber = (page ?? 1); return view(workers.topagedlist(pagenumber,pagesize)); } } }
黄色标记的为需要改动的部分。第5行,需要引用pagedlist。第12行currentfilter参数用来在翻页时保持搜索字符串不丢失。第17到25行的作用是,当有一个新的字符串要搜索,那么翻当前页就自动变成第一页,否则,当前页不变。第49-51行设置每页3条数据,设置页数,并将数据以list的形式发送个view。其中(page ?? 1)的意思是如果page为null则给page赋值为1否则,page不为null那么该是多少就是多少。所以能让默认页为1.
@model pagedlist.ipagedlist<slarkinc.models.worker> @using pagedlist.mvc; <link href="~/content/pagedlist.css" rel="stylesheet" /> <br /> @using(html.beginform("index","company",formmethod.get)) { <p> find by name: @html.textbox("searchstring",viewbag.currentfilter as string, new { @class = "form-control", @style = "display:inline" }) @html.submit("submit") </p> } <table class="table"> <tr> <th> @html.actionlink("first name", "index", new { sortorder = viewbag.firstnamesortparm }) </th> <th> @html.actionlink("last name", "index", new { sortorder = viewbag.lastnamesortparm }) </th> <th>sex</th> <th>rating</th> </tr> @foreach (var item in model) { <tr> <td> @html.displayfor(modelitem => item.firstname) </td> <td> @html.displayfor(modelitem => item.lastname) </td> <td> @html.displayfor(modelitem => item.sex) </td> <td> @html.displayfor(modelitem => item.rating) </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}))
第1行定义了pagedlist 类型的model。第2行引用pagedlist。第3行,引入,pagedlist相关的css文件,这个文件在安装插件的时候会自动保存到项目里。第5行beginform函数的参数有变化,其生成的form会使用get方法。get方法会在url里显示提交的参数,这样可以通过url来记录查询参数,方便通过复制url给他人来展现自己的查询结果。第42行用于显示第几页,共几页。第43-44行,用于生成每一页的按钮。
运行此页面,当页面出来时点击页面下方的"2"按钮转到第2页。生成的页面如下所示:
可以看到页面下方的分页按钮和页数统计,美观大方。
结尾
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: JAVA中4种解析XML文件的方法
下一篇: 笔记《版本控制之道--使用Git》