前几天做一个小小小项目,使用了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. jQuery的发展史

    jQuery的发展史,你知道吗? 每天多学一点知识,就少写一行代码2006年1月,jQuery的第一个版本面世,至今已经有6年多了(注:这个时间点是截止至出书时间).虽然过了这么久,但它依然以其简洁. ...

  2. JavaScript 函数的定义-调用、注意事项

    函数定义 函数语句定义 function(a,b){ return a+b; } 表达式定义 var add = function(a,b){return a+b}; //函数表达式可以包含名称,这在 ...

  3. 核心J2EE模式 - 截取过滤器

    核心J2EE模式 - 截取过滤器 背景 呈现层请求处理机制接收许多不同类型的请求,这些请求需要不同类型的处理.一些请求被简单转发到适当的处理程序组件,而其他请求必须在进一步处理之前进行修改,审核或未压 ...

  4. Arduino LiquidCrystal Library Bug Report #174181

    Arduino LiquidCrystal Character LCD Driver Library BUG Report #174181 by Conmajia Effected Devices H ...

  5. 纯原生javascript实现分页效果

    随着近几年前端行业的迅猛发展,各种层出不穷的新框架,新方法让我们有点眼花缭乱. 最近刚好比较清闲,所以没事准备撸撸前端的根基javascript,纯属练练手,写个分页,顺便跟大家分享一下 functi ...

  6. Android系统--输入系统(八)Reader线程_使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  7. Java排序算法之归并排序

    基本思想: 归并排序利用分治法,先将一个序列分成一个个子序列,然后对子序列进行排序,再把有序子序列合并为整体有序序列. 图片来自于http://www.cnblogs.com/shudonghe/p/ ...

  8. java 集合框架(List操作)

    /*list 基本操作 * * List a=new List(); * 增 * a.add(index,element);按指定位置添加,其余元素依次后移 * addAll(index,Collec ...

  9. split()方法

    split()方法用于把一个字符串分隔成字符串数组. 它有两个参数: separator:从参数指定的地方分隔字符串,必需: howmany:该参数可指定返回的数组的最大长度.如果设置了该参数,返回的 ...

  10. C#1所搭建的核心基础

    一,委托 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法接口. 委托类型声明中所描述的类型签名决定了哪个方法可以用于创建委托实例,同时决定了调用的签名:委托类型实际上只是参数类型的一个列 ...