https://www.cnblogs.com/miro/p/4134241.html

前置准备 – 应用之前样式,增加测试数据

界面样式修改前:

下面对Views --> Account --> Index.cshtml进行如下修改:

  1. 应用布局页 _LayoutAdmin.cshtml

2. 将HTML部分body之外的全部删掉,只留下正文内容,运行这个页面。

对样式做一些小调整,最终变成如下样式。

(调整样式的步骤略,大家可以直接查看源码)

通过Create New 新建两条测试数据,为后面分页做准备,后面每3条分一页。

目前准备工作就OK了,下面开始今天功能的操作。

详细步骤

一、标题添加链接排序功能

  1. 打开 Controllers --> AccountController.cs, 修改Index方法如下

2. 打开 Views-->Account-->Index.cshtml, 替换标题内容。

@Html.ActionLink("UserName", "Index", new { sortOrder = ViewBag.NameSortParm })   //方法的参数值

点击标题就可以在升序倒序中切换了

二、增加名字搜索功能

继续修改Index方法,增加条件筛选功能。改动的部分见黄色背景部分。

我们添加了一个 searchString 的参数,并且添加了一个where字句用来过滤名字。

现在我们再去ViewsàAccountàIndex.cshtml 中添加一个text box用来传递这个过滤值。

现在测试一下,运行这个页面,可以看到结果符合我们的预期。

好的,下面就完成最后一个功能,分页。

三、增加分页功能(使用PagedList.MVC)

安装PagedList.MVC

打开Package Manager Console,确保Package source是nuget.org, 输入

install-package PagedList.mvc

AccountController.cs中先添加声明。

using PagedList;

修改Index方法

Index的增加如下highlight部分(我只截取了开头和结尾的部分)

我们添加了两个传入参数 currentFilter和page

页面第一次显示或没有点击页码或排序时,所有传入的值为null

当点击分页链接时,传入页码。

current sort order需要被传入,这是因为在分页时,需要保持相同顺序。

ViewBag.CurrentSort = sortOrder;

另外一个属性, ViewBag.CurrentFilter, 提供view当前的过滤字符串。

这个值用来维持分页时过滤条件不变,并且必须在分页时重新显示在text box中。如果子分页时过滤条件改变了,页面必须重设为1,因为新的过滤条件会导致显示不同的数据. 当过滤条件改变时, searchString不为null

在最后,ToPagedList将查询结果转换成分页的一个集合传递到view中。

Note

?? 操作符叫做 null-coalescing operator.

这个操作符给可为null的类型定义一个默认值。 (page ?? 1)表示如果page为null返回1,否则返回page的值。

大家直接看下面例子:

在View中增加分页的显示和功能链接

主要增加/修改 如下部分:

顶部的@model声明指定view获得一个PagedList对象。

(原来是List对象,见注释部分)

增加@using PagedList.Mvc , 获得相关分页的helper

重载BeginForm为get方式。

我们之前文章提到过,如果不涉及更新数据操作,建议用get方式。

text box 初始化为CurrentFilter.

这样当切换到下一页是可以看到当前过滤条件。

表格的标题链接也把CurrentFilter传过去。

最后再加上类似 Page x of x格式的当前页数和总共数量。

如果没有页面显示,则显示 Page 0 of 0

这种情况下,page number>page count.

根据Index方法可以得知PageNumber是1,Model.PageCount是0.

分页按钮通过PagedListPager helper来显示。

最终结果

第二页

遗留问题

最后做了个实验,发现有个问题,知道的园友帮忙解答下。

对UserName排序没问题。

我用Email排序时,如果直接把条件加到表达式中,都是OK的,如下图。

倒序排

如果按下面这种方式

不论正序还是倒序,都出现如下结果:

问题总结,下面两种写法,第二种不符合预期。

总结

本次我们主要讲解了排序、过滤条件、分页三个功能。

另外还有个遗留问题,知道的园友解答下。

这次的知识点比较碎,详细的可以参考代码。

请充分理解本篇文章所讲的几个例子。

MVC5+EF6入门完整教程7:排序过滤分页的更多相关文章

  1. MVC5+EF6 入门完整教程

    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...

  2. MVC5+EF6 入门完整教程九

    前一阵子临时有事,这篇文章发布间隔比较长,我们先回顾下之前的内容,每篇文章用一句话总结重点. 文章一 MVC核心概念简介,一个基本MVC项目结构 文章二 通过开发一个最基本的登录界面,介绍了如何从Co ...

  3. MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  4. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  5. MVC5 + EF6 入门完整教程二

    从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...

  6. MVC5+EF6 入门完整教程12--灵活控制Action权限

    大家久等了. 本篇专题主要讲述MVC中的权限方案. 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一. 前面的系列文章中我们用到了 SysUser, SysRole, SysUserR ...

  7. MVC5+EF6 入门完整教程 总目录

    本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...

  8. MVC5 + EF6 入门完整教程1

    https://www.cnblogs.com/miro/p/4030622.html 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定& ...

  9. MVC5 + EF6 入门完整教程(转载)--01

    MVC5 + EF6 入门完整教程   第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定&qu ...

  10. MVC5+EF6 入门完整教程四

    上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model à 创建Database Context à创建databaseInitializerà配置entityFramewor ...

随机推荐

  1. JavaScript 与 Java 有什么不同?

    JavaScript 编程语言是由 Netscape,Inc. 开发的,它并不是 Java 平台的一部分. JavaScript 不会创建小应用程序或独立应用程序.在最常见的形式中,JavaScrip ...

  2. ARTS Week 2

    Nov 4,2019 ~ Nov 10,2019 Algorithm 本周主要的算法是如何求两个数的最大公因数.传统的想法便是对这两个数分解质因数,而后找到其公共因数,再相乘,这样就会得到最大公因数了 ...

  3. 刚安装了ftp之后无法使用root访问,服务器发回了不可路由的地址。使用服务器地址代替。

    真的艰辛,用了整整一个下午加晚上,才把服务器搭建好,中间真的好多坑... 错误1: vsftpd正确配置: vsftpd.conf: pam_service_name=vsftpduserlist_e ...

  4. error C2338: No Q_OBJECT in the class with the signal (NodeCreator.cpp)

    在Qt中,当派生类需要用到信号与槽机制时,有两个要求. 1.该类派生自QObject类. 2.类中有Q_OBJECT宏. 本次报错的原因就是因为没有在类中添加Q_OBJECT宏. 而我的出错原因更傻逼 ...

  5. [redis读书笔记] 第二部分 单机数据库 数据库实现

    一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...

  6. 10-SpringMVC04

    FreeMarker 1.入门案例 1. 导包:freemarker.jar 2. 需要创建模板文件的路径:src/main/resources/template 3. 创建一个模板对象:hello. ...

  7. java String hashCode遇到的坑

    在进行数据交换时,如果主键不是整型,需要对字符串,或联合主键拼接为字符串,进行hash,再进行取模分片,使用的是String自带的hashCode()方法,本来是件很方便的事,但是有些字符串取hash ...

  8. 【转载】STM32 ST-LINK Utility介绍、下载、安装、使用方法

    转载地址:https://blog.csdn.net/ybhuangfugui/article/details/52597133 总结的很好!!! Ⅰ.写在前面本文讲述的内容是STM32 ST-LIN ...

  9. 用msi安装MySQL时MySQL Server组件不能安装,或安装失败

    我的环境:       MySQL8.0.15,       win10 错误描述:在安装MySQL时,如果MySQL Server组件提示不能安装,错误提示是:VS 2015没有安装或安装失败.原因 ...

  10. C++中字符常量与字符常量不能直接相加

    定义string变量,并进行初始化,如下: string s1 = "Hello"; string s2 = s1 + "World"; string s3 = ...