前几天做一个小小小项目,使用了MVC+Bootstrap,以前做分页都是异步加载Mvc部分视图的方式,因为这个是小项目,就随便一点。一般的列表页面,少不了有查询条件,下面分享下Drapper+PagedList.Mvc支持多查询条件分页的使用经验。

构建强类型Model

1.查询参数的Model

    public class OrderQueryParamModel
{
/// <summary>
/// 订单编号
/// </summary>
public string OrderNo { get; set; } /// <summary>
/// 客户名称
/// </summary>
public string CustomerName { get; set; }
}

2.Orders分页数据Model

PagedList提供了一个StaticPagedList<T>泛型类来封装数据。(看看StaticPagedList的源代码,使用非常方便,把T类型的数据subset,pageNumber,pageSize,totalCount初始化进去就可以了。

 public StaticPagedList(IEnumerable<T> subset, IPagedList metaData) : this(subset, metaData.PageNumber, metaData.PageSize, metaData.TotalItemCount)
{
}

3.Orders展示页面整体Model

    public class OrderViewModel
{
public OrderQueryParamModel QueryModel { get; set; } public PagedList.StaticPagedList<OrderModel> OrderList { get; set; }
}

OK,接下来看看在Controller中如何给来OrderViewModel填充数据吧

        public ActionResult List(OrderViewModel orderViewModel, int page = )
{
var pagesize = ;
var count = ; var orders = _orderService.GetOrders(page, pagesize, orderViewModel.QueryModel, ref count); orderViewModel.OrderList = new StaticPagedList<OrderModel>(orders, page, pagesize, count); return View(orderViewModel);
}

Controller中代码很简单,接收POST过来的两个参数,orderViewModel:包含查询参数Model,page:PagedList定义的当前页。

顺便看看GetOrders()这个方法吧,为了省事懒得写存储过程,直接用了Drapper的QueryMultiple,感觉很强大啊。

        public List<OrderModel> GetOrders(int pageindex, int pagesize, OrderQueryParamModel query, ref int count)
{
var orders = new List<OrderModel>();
var whereStr = string.Empty; if (query != null)
{
if (!string.IsNullOrEmpty(query.CustomerName))
{
whereStr += string.Format(" and CustomerName like '%{0}%' ", query.CustomerName);
}
} var cmd = string.Format(@"SELECT COUNT(*) FROM [Orders] WHERE 1=1 {0};
SELECT * FROM (
SELECT *, row_number() OVER (ORDER BY orderId DESC ) AS [row]
FROM [Orders] WHERE 1=1 {0} )t
WHERE t.row >@indexMin AND t.row<=@indexMax", whereStr); using (IDbConnection conn = BaseDBHelper.GetConn())
{
using (var multi = conn.QueryMultiple(cmd,
new { indexMin = (pageindex - ) * pagesize, indexMax = pageindex * pagesize }))
{
count = multi.Read<int>().SingleOrDefault();
orders = multi.Read<OrderModel>().ToList();
}
}
return orders;
}

这里要注意下的是,multi.Read的顺序必须和Sql查询出来的数据集合顺序一样。

前端数据展示

1.首先在View中添加引用

@using PagedList.Mvc;
@using PagedList;
@model Models.OrderViewModel 

2.为查询创建一个表单

<div class="page-header">

    @using (Html.BeginForm("List", "Order", FormMethod.Post, new { id = "OrderForm", @class = "form-horizontal" }))
{
@Html.Raw("客户名称:") @Html.TextBoxFor(m => m.QueryModel.CustomerName)
@Html.Raw("订单编号:") @Html.TextBoxFor(m => m.QueryModel.OrderNo) <button type="submit" class="btn btn-purple btn-sm">查询</button> //咿,这个干吗用的?后面会解释
<input type="hidden" name="page" value="" />
}
</div>

3.绑定数据

<table class="table loading table-bordered margin-top-5 margin-bottom-5">
<thead>
<tr>
<th>订单编号</th>
<th>客户名称</th>
<th>手机号码</th>
<th>商品数量</th>
<th>订单金额</th>
<th>下单时间</th>
</tr>
</thead>
<tbody> @foreach (var item in Model.OrderList)
{
<tr>
<td>@item.orderNo</td>
<td>@item.customerName</td>
<td>@item.customerMobile</td>
<td>@item.productQuantity</td>
<td>@item.orderAmount</td>
<td>@item.orderCreateTime</td>
</tr>
}
</tbody>
</table>

4.绑定分页插件数据

@if (Model.OrderList != null&&Model.OrderList.Any())
{
<div class="pagedList" style="margin:0 auto;text-align:center">
@Html.PagedListPager(Model.OrderList, page => Url.Action("List", new { page }), PagedListRenderOptions.Classic)
</div>
}

OK,一切搞定了,运行你会发现,分页导航生成的链接都是 "/Order/List/2" 这种形式,无法支持我们把其他查询参数也传递到Controller。

我们换一个思路,为什么不把page这个参数放到form表单去了?  还记得我们form中有一个name=page 的hidden input吧?

    $(function () {

        $(".pagination > li > a").click(function () {

            event.preventDefault();

            var index = $(this).html();

            if (index == '»') {
index = parseInt($(".pagination > li[class=active] > a").html()) + 1;
}
if (index == '«') {
index = parseInt($(".pagination > li[class=active] > a").html()) - 1;
} if (index < 1) return; $("input[name=page]").val(index);
$("#OrderForm").submit();
}); });

通过这段JS,直接把原来分页的a标签作废了,获取他的page值放到了form中,然后直接触发form的submit(),这样就满足了我们一般的查询业务需求。

本文博客园地址:http://www.cnblogs.com/struggle999/p/6918524.html

MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查询条件分页的更多相关文章

  1. MVC客户管理(添加、修改、查询、分页)

    ASP.NET MVC搭建项目后台UI框架—6.客户管理(添加.修改.查询.分页)   目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2 ...

  2. KnocoutJs+Mvc+BootStrap 学习笔记(Mvc)

    Mvc   1.Html 增加扩展方法 using System.Web.Mvc; namespace KnockoutBootstrapMvc.Entensions { public static ...

  3. 再谈使用X.PagedList.Mvc 分页(ASP.NET Core 2.1)

    在以前的博文中写过使用X.PagedList.Mvc组件来对ASP.NET MVC应用程序进行分页,可以参考此篇随笔:Asp.net MVC 使用PagedList(新的已更名 为X.PagedLis ...

  4. MVC Bootstrap极速开发框架

    ASP.NET MVC Bootstrap极速开发框架 前言 每次新开发项目都要从头开始设计?有木有一个通用的快速开发框架?并且得是ASP.NET MVC  And Bootstrap?数据库不要手工 ...

  5. SpringMVC Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

    SpringMVC学习系列(12) 完结篇 之 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现 到这里已经写到第12篇了,前11篇基本上把Spring M ...

  6. 使用EF+ASP.NET MVC+Bootstrap开发一个功能强大的问卷调查系统

    功能简介 支持七大题型 下拉选择题.单选题.多选题.填空题.数字题.问答题.组合/矩阵题(单选组合.多选组合.填空组合.数字组合) 题库支持 每个问卷都要设置姓名.年龄.性别.学历,怎么办?题库帮您轻 ...

  7. Asp.net MVC 使用PagedList(新的已更名 为X.PagedList.Mvc) 分页

    在asp.net mvc 中,可以bootstrap来作为界面,自己来写分页程序.也可以使用PagedList(作者已更名为 X.PagedList.Mvc)来分页. 1.首先,在NuGet程序包管理 ...

  8. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  9. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构

      基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业 ...

随机推荐

  1. 读书笔记 effective c++ Item 49 理解new-handler的行为

    1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常.很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做.你仍然会看到这种旧行为,但是我会把关于它的讨 ...

  2. 原生JS跨浏览器事件封装处理

    引子:用javascript给元素绑定事件,我们可以用addEventListener这个方法,然而这个方法有兼容问题,比如在IE浏览器上面就无效,在IE上面要用attachEvent这个方法 一.a ...

  3. PHP站内搜索

    1.SQL语句中的模糊查找 LIKE条件一般用在指定搜索某字段的时候, 通过"% 或_" 通配符的作用实现模糊查找功能,通配符可以在前面也可以在后面或前后都有. 搜索以PHP100 ...

  4. java进制转换(无视正负数的差别)

    最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤其是对于负数这一方面. 下面和大家分享一下,这里只写了十进制到二进制的转换,其实都是同样的道理 public class Test1 { pub ...

  5. [ SharePoint ADFS 开发部署系列 (一)]

    前言 本文完全原创,转载请说明出处,希望对大家有用. 随着企业信息化建设逐渐成熟,基于微软体系的企业内部系统架构在众多企业中得到应用,随之而来的用户统一身份认证(SSO)问题成为企业IT部门急需解决的 ...

  6. Python数据处理——numpy_1

    python中数据处理最基础的一个包--numpy.它能很好的进行数据准备,类似与R语言中的数据框(DataFrame)一样.今天,就来从最基础的开始学习. import numpy as npdat ...

  7. Python 基础 一

    Python 基础  一 一.关于Python的介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum),这一两年在国内很流行,应用很广泛. 二.Python的基础知识(1) 1 ...

  8. 表单提交音乐文件(php)

    利用点空闲时间来写个博客,最近做的项目中需要表单提交音频的,图片的,各种类型,把它存到数据库里,这里先来说一下音乐文件的表单提交吧,后几天再来更新输入数据库的,先看一下效果 点击浏览 就会出来预览,点 ...

  9. Python:字符串的分片与索引、字符串的方法

    这是关于Python的第3篇文章,主要介绍下字符串的分片与索引.字符串的方法. 字符串的分片与索引: 字符串可以用过string[X]来分片与索引.分片,简言之,就是从字符串总拿出一部分,储存在另一个 ...

  10. Caffe2 Tutorials[0]

    本系列教程包括9个小节,对应Caffe2官网的前9个教程,第10个教程讲的是在安卓下用SqueezeNet进行物体检测,此处不再翻译.另外由于栏主不关注RNN和LSTM,所以栏主不对剩下两个教程翻译. ...