系列教程:MVC5 + EF6 + Bootstrap3

上一节:MVC5 + EF6 + Bootstrap3 (10) 数据查询页面

源码下载:点我下载

我工作的源码:http://www.jinhusns.com/Products/Download/?type=xcj

目录

前言

上一节我们做到了如下的一个基础查询页面。本节我们向这个页面中加入排序、搜索和分页功能。

排序

从上图中的地址栏中可以看到这个页面调用的是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个值体现在18到32行的 switch..case语句中。如果是first_desc则对FirstName用OrderByDescending倒序排列。如果是 last_desc则对LastName倒序排列。如果是last则对LastName用OrderBy函数顺序排列。如果是空则对FirstName顺 序排列。第13-14行用Viewbag存储当前排列的相反排列字符串,用于在View中生成链接。第15-16行,用Linq to Entity 从数据库中选取要排序的数据。第33行将排序好的数据以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页。生成的页面如下所示:

可以看到页面下方的分页按钮和页数统计,美观大方。

结尾

嗯,不知不觉,快半夜一点了。加油!

喜欢的话就推荐下吧http://www.jinhusns.com/Products/Download/?type=xcj

MVC5 + EF6 + Bootstrap3 (11) 排序、搜索、分页的更多相关文章

  1. MVC5 + EF6 + Bootstrap3 (12) 新建数据

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-create.html 系列教程:MVC5 + EF6 + ...

  2. MVC5 + EF6 + Bootstrap3 (10) 数据查询页面

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-search-page.html 系列教程:MVC ...

  3. (12) MVC5 EF6 Bootstrap3

    MVC5 + EF6 + Bootstrap3 (12) 新建数据 系列教程:MVC5 + EF6 + Bootstrap3 上一节:MVC5 + EF6 + Bootstrap3 (11) 排序.搜 ...

  4. MVC5 + EF6 + Bootstrap3系列教程

    本系列教程以ASP.NET MVC5为核心框架,使用Entity Framewok6访问数据,并使用Bootstrap3作为前端UI框架.帮助大家开发出一套高效.美观.稳定.实用的软件系统. MVC5 ...

  5. MVC5 + EF6 + Bootstrap3 (16) 客户端验证

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-client-side-validation.html 系列 ...

  6. MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-server-side-validation.html 系列 ...

  7. MVC5 + EF6 + Bootstrap3 (14) 分部视图PartialView

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-partialview.html 系列教程:MVC5 + E ...

  8. MVC5 + EF6 + Bootstrap3 (13) 查看详情、编辑数据、删除数据

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-rud.html 系列教程:MVC5 + EF6 + Boo ...

  9. MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-httphelper-part2.html 上一节 ...

随机推荐

  1. CSV - 操作比较

    在数据报表生成的时候,我们一般会用程序去生成CSV.其中有些需要注意的地方. log_file = open('delay.%s.csv' % s_end, 'w') log_file.write(' ...

  2. Apache shiro之身份验证(登陆)流程

    从张开涛blog学习后整理:http://jinnianshilongnian.iteye.com/blog/2018398 上图中的类和接口都可以继承和实现来个性化自己的实现. 其中重点看一下Mod ...

  3. 私服 Nexus 的配置

    一.概述 1.概要 现在的项目基本都是用Maven来管理工程,这样一来在公司内容搭建一个私服就非常有必要了,这样一来可以管理公司内部用的JAR包,也可以管理第三方的各种JAR来,以免每次都要从外网的仓 ...

  4. Python: Catch multiple exceptions in one line (except block)

    Enclose in parentheses: except (IDontLIkeYouException, YouAreBeingMeanException) as e: pass Separati ...

  5. [JS Compose] 0. Understand 'Box' or 'Container', they are just like Array!

    We'll examine how to unnest function calls, capture assignment, and create a linear data flow with a ...

  6. iOS开发 - AVPlayer实现流音频边播边存

    边播边下有三套左右实现思路,本文使用AVPlayer + AVURLAsset实现. 概述 1. AVPlayer简介 AVPlayer存在于AVFoundation中,可以播放视频和音频,可以理解为 ...

  7. cocos2dx 帧动画的两种创建方式

    看了好几天cocos2dx的帧动画,现在才有点眉目,为了高效期间我们一般会用到 精灵帧缓存(CCSpriteFrameCache) 和动画缓存(CCAnimationCache) .大体的操作步骤: ...

  8. 华为 HG8245C 光猫 修改无线用户数限制+hw_ctree.xml 文件解密

    这个操作方法是 从网上其他人提供的方法  和我一个朋友总结出来的,我只是负责整理,并实地在我自己的光猫上操作成功了 风险提示 :刷机有风险,操作需谨慎, 备份备份备份! 俺家,俺的新家是电信光纤接入, ...

  9. 无插件纯Web HTML5 3D机房 终结篇(新增资产管理、动环监控等内容)

    原本以为这次的机房资产管理项目告一段落,可以歇一歇,哥还是太天真了.我们伟大的甲方又拿下了第二期的项目,誓把哥的才华发挥到极致啊.国庆长假也没正经休息几天,硬是给人折腾出了个demo,加上了容量管理. ...

  10. Android UI开发第四十二篇——实现实现易信的圆形图像和对话列表的图像显示部分

    显示图像时,很多个性化显示,圆形或圆角.气泡等等,我们这一篇文章探讨一下圆形和气泡的显示,仿照易信中的实现,先看下效果图: 代码: public class RoundImageView extend ...