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页。生成的页面如下所示:

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

结尾

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 一个简单MVC5 + EF6示例分享

    本文所使用的软件及环境: Visual Studio Ultimate 2013; MVC5 + EF6 + .NET Framework 4.5 + LocalDB;Windows 7 x64 Professional 说明: 1.在EF (Entity Framework,以下简称EF6)框架下,操作数据的方式有三种:Database First, Model First, 以及 Code First,本文基于Code First创建. 2.本文是基于MVC5创建: 3.LocalDB Lo

  • 基于mvc5+ef6+Bootstrap框架实现身份验证和权限管理

    近和朋友完成了一个大单子架构是mvc5+ef6+Bootstrap,用的是vs2015,数据库是sql server2014.朋友做的架构,项目完成后觉得很多值得我学习,在这里总结下一些心得. 创建项目一开始删掉App_Start目录下的IdentityConfig.cs和Startup.Auth.cs文件;清空Modle文件夹,Controller文件夹和相应的View; 删除目录下的ApplicationInsights.config文件和Startup.cs文件 修改web.config文

  • 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 { pub

  • Vue.js实现多条件筛选、搜索、排序及分页的表格功能

    与上篇实践教程一样,在这篇文章中,我将继续从一种常见的功能--表格入手,展示Vue.js中的一些优雅特性.同时也将对filter功能与computed属性进行对比,说明各自的适用场景,也为vue2.0版本中即将删除的部分filter功能做准备. 需求分析 还是先从需求入手,想想实现这样一个功能需要注意什么.大致流程如何.有哪些应用场景. 表格本身是一种非常常用的组件,用于展示一些复杂的数据时表现很好. 当数据比较多时,我们需要提供一些筛选条件,让用户更快列出他们关注的数据. 除了预设的一些筛选条

  • Mysql排序和分页(order by&limit)及存在的坑

    排序查询(order by) 电商中:我们想查看今天所有成交的订单,按照交易额从高到低排序,此时我们可以使用数据库中的排序功能来完成. 排序语法: select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc]; 需要排序的字段跟在order by之后: asc|desc表示排序的规则,asc:升序,desc:降序,默认为asc: 支持多个字段进行排序,多字段排序之间用逗号隔开. 单字段排序 mysql> create table test2(

  • ASP.NET MVC使用Boostrap实现产品展示、查询、排序、分页

    在产品展示中,通常涉及产品的展示方式.查询.排序.分页,本篇就在ASP.NET MVC下,使用Boostrap来实现. 源码放在了GitHub: https://github.com/darrenji/ProductsSearchSortPage 先上效果图: 最上面是搜索和排序,每次点击搜索条件.排序,或者删除搜索条件都会触发异步加载. 中间部分为产品展示,提供了列表和格子这2种显示方式. 最下方为分页. 能实现的功能包括: 点击某一个搜索条件,该搜索条件被选中,选中项以标签的形式显示到"搜索

  • Yii2.0小部件GridView(两表联查/搜索/分页)功能的实现代码

     GridView 两表联查/搜索/分页 当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中,对数据进行搜索,排序. Ⅰ.控制器层Controller <?php namespace backend\controllers; header("Content-type:text/html;charset=utf-8"); use Yii; use yii\web\C

  • 在ASP.NET 2.0中操作数据之二十六:排序自定义分页数据

    导言 和默认翻页方式相比,自定义分页能提高几个数量级的效率.当我们的需要对大量数据分页的时候就需要考虑自定义分页,然而实现自定义分页相比默认分页需要做更多工作.对于排序自定义分页数据也是这样,在本教程中我们就会扩展前面的例子来实现自定义分页数据的排序. 注意:既然本教程是基于前一个的,因此我们需要把前面教程示例页面EfficientPaging.aspx的<asp:Content>元素中的代码复制到本教程SortParameter.aspx示例页面中.关于如何进行这样的复制操作请参看为删除数据

  • XML创建可排序、分页的数据显示页面

    在Web开发中,我们经常会遇到分页显示和排序数据记录集的情况,这在服务器端使用服务器端的代码和数据库技术是件很轻松的事情,比如:ASP.PHP.JSP等.然而,如果要在客户端显示多条记录并且排序是一件很令人头疼的事情.下面,我们利用Extensible Markup Language(XML,可扩展标记语言)和Extensible Stylesheet Language Transformations(XSLT,可扩展样式单语言转换),并结合XML Path Language(XPath,XML

  • Python排序搜索基本算法之堆排序实例详解

    本文实例讲述了Python排序搜索基本算法之堆排序.分享给大家供大家参考,具体如下: 堆是一种完全二叉树,堆排序是一种树形选择排序,利用了大顶堆堆顶元素最大的特点,不断取出最大元素,并调整使剩下的元素还是大顶堆,依次取出最大元素就是排好序的列表.举例如下,把序列[26,5,77,1,61,11,59,15,48,19]排序,如下: 基于堆的优先队列算法代码如下: def fixUp(a): #在堆尾加入新元素,fixUp恢复堆的条件 k=len(a)-1 while k>1 and a[k//2

  • MySQL 查询的排序、分页相关

    概述 数据库中的数据直接呈现出来一般不是我们想要的,所以我们上两节演示了如何对数据进行过滤的方法.除了对数据进行过滤, 我们可能还需要对数据进行排序,比如想从列表中了解消费最高的项,就可能需要对金额字段做降序排序,想看年龄从小到大的分布情况,就可能需要对user表的age字段进行升序排序. 也可能需要对数据进行限制,比如我们需要对付款的1~10,11~20,21~30 名的用户分别赠予不同的礼品,这时候对数据的限制就很有用了. 备注:下面脚本中[]包含的表示可选,| 分隔符表示可选其一. 数据排

  • MySQL排序与分页讲解

    目录 一.order by 二.二级排序 三.分页limit 一.order by 使用 ORDER BY 对查询到的数据进行排序操作.升序:ASC (ascend)                    从低到高降序:DESC (descend)               从高到低 eg: 1.对stu表中的成绩(grade)从高到低排序 2.对stu表中的成绩(grade)从低到高排序 1.select * from stu order by drade desc; 2.select * 

随机推荐