前段时间整mvc的分页,倒是很顺利,参考了以下几篇博客,启发很大。

http://www.cnblogs.com/tangmingjun/archive/2012/05/30/2526301.html

http://www.cnblogs.com/tangmingjun/archive/2012/05/31/2528732.html

顺便扩展了需求,在分页的基础上,继续做关键字查询。

用PagedList生成的页码链接虽然样式很漂亮,但是要做到无刷新的分页,PagedList自动生成的代码是不够用的,可以配合jsRender和Ajax做上面的效果,同时手动构建PagedList生成的页码标签,根据自己的需要设置href和onclick事件。

直接上代码

前台:

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} <h2>商品信息</h2> <p>
@Html.ActionLink("新建", "Create") |
@Html.Editor("txtSearch")
<input type="button" value="查找" id="btnSearch" />
<img id="imgWaiting" src="~/Images/loading.gif" style="display:none; width:30px; height:30px;" />
</p>
<table class="table">
<thead>
<tr>
<th>商品名称</th>
<th>商品描述</th>
<th>原价</th>
<th>特价(现价)</th>
<th>销量</th>
<th>修改日期</th>
<th>商品链接</th>
<th>状态</th>
<th>图片</th>
<th></th>
</tr>
</thead>
<tbody id="tblContent"></tbody>
</table>
<div id="divPage"></div> <script type="text/x-jsrender" id="contentTemplate">
<tr>
<td>{{:GoodName}}</td>
<td>{{:Description}}</td>
<td>{{:OriginalPrice}}</td>
<td>{{:SpecialPrice}}</td>
<td>{{:Sales}}</td>
<td>{{:ActiveTime}}</td>
<td>{{:Url}}</td>
<td>{{:Status}}</td>
<td>{{:PicPath}}@*<img id="PicPath" src="{{:PicPath}}" class="thumbnailPdt" />*@</td>
<td>
<a href="/Admin/Goods/Edit/{{:GoodID}}">Edit</a> |
<a href="/Admin/Goods/Delete/{{:GoodID}}">Delete</a>
</td>
</tr>
</script> @section Scripts{
<script src="~/Scripts/jsrender.min.js" type="text/javascript"></script>
<script>
var key = "";
function doSearch(page) {
key = $("#txtSearch").val();
$.post(
"/Admin/Goods/SearchProduct",
{ keyword: key, pageNo: page },
function (data, status) {
//数据写到前台
$("#tblContent").html($("#contentTemplate").render(data.contents));
$("#divPage").html(data["pageList"]);
},
"json"
);
};
//绑定点击查询事件
$("#btnSearch").click(function () {
doSearch(1);
});
//输入框回车开始查询
$("#txtFilter").bind("keypress", function () {
if (event.keyCode == 13) { $("#btnSearch").click(); return false; }
});
//加载初始化数据
$(function () {
doSearch(1);
});
</script>
}

后台Controller:

public ActionResult Index()
{
return View();
} public JsonResult SearchProduct(string keyword, int? pageNo)
{
int pageIndex = pageNo ?? ;
int totalCount;
var goods = GetSearchData(keyword, ref pageIndex, _PageSize, out totalCount);
int totalPage = totalCount / _PageSize + (totalCount % _PageSize == ? : );
var pagerHtml = ExHtml.CreatePagesHtml(totalPage, pageIndex); return Json(new { contents = goods, pageList = pagerHtml }, JsonRequestBehavior.DenyGet);
} List<Good> GetSearchData(string keyword, ref int pageIndex, int pageSize, out int totalCount)
{
var linq = from p in db.Goods select p;
if (!string.IsNullOrWhiteSpace(keyword))
{
linq = linq.Where(t =>
t.GoodID.ToString() == keyword
|| t.GoodName.Contains(keyword)
|| t.Description.Contains(keyword)
);
}
totalCount = linq.Count();
//修正pageIndex
var maxPage = totalCount / pageSize + (totalCount % pageSize == ? : );
if (pageIndex < ) pageIndex = ;
if (pageIndex > maxPage) pageIndex = maxPage;
linq = linq.OrderByDescending(x => x.GoodID)
.Skip((pageIndex - ) * pageSize)
.Take(pageSize); return linq.ToList();
}

扩展函数:

public static string CreatePagesHtml(int totalPageNo, int currPageNo, string jsClickName = "doSearch")
{
if (currPageNo > totalPageNo || currPageNo < || totalPageNo == ) return "";
string res = "";
if (currPageNo > ) res += LiForFirst(jsClickName);//有跳转到第一页
//if (currPageNo > 2) res += LiForPrev(currPageNo - 1, jsClickName);//跳转到前一页
if (currPageNo > ) res += LiForOthers();//无跳转,显示中间有页面
if (currPageNo > ) res += LiForPage(currPageNo - , jsClickName);//前两页
if (currPageNo > ) res += LiForPage(currPageNo - , jsClickName);//前一页 res += LiForCurr(currPageNo);//当前页 if (currPageNo < totalPageNo) res += LiForPage(currPageNo + , jsClickName);//下一页
if (currPageNo < totalPageNo - ) res += LiForPage(currPageNo + , jsClickName);//下两页
if (currPageNo < totalPageNo - ) res += LiForOthers();//无跳转,显示中间有页面
//if (currPageNo < totalPageNo - 1) res += LiForNext(currPageNo + 1, jsClickName);//跳转到后一页
if (currPageNo < totalPageNo - ) res += LiForLast(totalPageNo, jsClickName);//跳转到最后页
return string.Format(@"
<div class=""pagination-container"">
<ul class=""pagination"">
{0}
</ul>
</div>"
, res);
}
static string GetPageItem(int pageNo, string text, string jsClickName, string classStr = null, string rel = null)
{
return string.Format(@"<li{0}><a href=""#""{1}{2}>{3}</a></li>"
, string.IsNullOrWhiteSpace(classStr) ? "" : " class=\"" + classStr + "\""
, string.IsNullOrWhiteSpace(rel) ? "" : " rel=\"" + rel + "\""
, string.IsNullOrWhiteSpace(jsClickName) ? "" : string.Format(" onclick=\"{0}({1});\"", jsClickName, pageNo)
, text
);
}
static string LiForFirst(string jsClickName) { return GetPageItem(, ""/*"««"*/, jsClickName, classStr: "PagedList-skipToFirst"); }
static string LiForPrev(int pageNo, string jsClickName) { return GetPageItem(pageNo, "«", jsClickName, classStr: "PagedList-skipToPrevious", rel: "prev"); }
static string LiForNext(int pageNo, string jsClickName) { return GetPageItem(pageNo, "»", jsClickName, classStr: "PagedList-skipToNext", rel: "next"); }
static string LiForLast(int totalPageNo, string jsClickName) { return GetPageItem(totalPageNo, totalPageNo.ToString()/*"»»"*/, jsClickName, classStr: "PagedList-skipToLast"); }
static string LiForPage(int pageNo, string jsClickName) { return GetPageItem(pageNo, pageNo.ToString(), jsClickName); }
static string LiForCurr(int pageNo) { return GetPageItem(pageNo, pageNo.ToString(), null, classStr: "active"); }
static string LiForOthers() { return GetPageItem(, "…", null, classStr: "disabled PagedList-ellipses"); }

前台的关键代码是js函数doSearch,通过post发送请求,请求成功后处理返回的json数据,并重新加载页面部分元素。json数据包有两个属性,一个contents,里面是类型为List<T>的数据,通过jsrender的调用,生成前台表格的tbody中的代码;另一个pageList是后台组装好的,显示page按钮的string。

后台Controller代码中,主要是第二个函数SearchProduct,它可以作为一个controller下面的action调用,在里面执行查询数据,以及组装pageHtml的操作,并打包这些数据成json数据,返回给前台。

扩展函数代码则主要是组装page的string结果。这部分参考PagedList生成的页码标签的代码,样式在bootstrap里面都有。

环境:VS2013 + MVC5.0 + Bootstrap 3.0

JsRender下载地址

ASP.NET MVC分页 Ajax+JsRender的更多相关文章

  1. ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版

    MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...

  2. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

  3. ASP.NET MVC 实现AJAX跨域请求方法《1》

    ASP.NET MVC 实现AJAX跨域请求的两种方法 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据 ...

  4. 在Asp.Net MVC中用Ajax回调后台方法

    在Asp.Net MVC中用Ajax回调后台方法基本格式: var operData = ...; //传递的参数(action中定义的) var type = ...; //传递的参数(action ...

  5. ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页

    我之前就已经实现了ASP.NET MVC分页(查看该博文),但它有局限性,必须确保在同一个视图中只能有一处分页,若需要在同一个视图中设置多个分页,却无能为力,为此,我重新对原先的代码进行了优化,增加了 ...

  6. [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传

    原文 [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传 Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件 ...

  7. 基于Bootstrap的Asp.net Mvc 分页

    基于Bootstrap的Asp.net Mvc 分页的实现 最近写了一个mvc 的 分页,样式是基于 bootstrap 的 ,提供查询条件,不过可以自己写样式根据个人的喜好,以此分享一下.首先新建一 ...

  8. Asp.Net MVC 使用 Ajax

    Asp.Net MVC 使用 Ajax Ajax 简单来说Ajax是一个无需重新加载整个网页的情况下,可以更新局部页面或数据的技术(异步的发送接收数据,不会干扰当前页面). Ajax工作原理 Ajax ...

  9. Asp.Net MVC Unobtrusive Ajax

    1.   Unobtrusive JavaScript介绍 说到Unobtrusive Ajax,就要谈谈UnobtrusiveJavaScript了,所谓Unobtrusive JavaScript ...

随机推荐

  1. Asp.net(C#)常用正则表达式封装

    using System; using System.Collections; using System.Text.RegularExpressions; namespace MSCL { //// ...

  2. Java 8 – How to format LocalDateTime

    Few examples to show you how to format java.time.LocalDateTime in Java 8. 1. LocalDateTime + DateTim ...

  3. Mac使用技巧总结-如何独立设置Mac触摸板方向和鼠标滚轮方向?

    Mac使用技巧总结 如何独立设置Mac触摸板方向和鼠标滚轮方向? 苹果Macbook的使用者都知道,Mac自带的触控板非常好用,不仅支持多手势操控,而且手感极佳,使用流畅. 但是如果对鼠标的焦距有高有 ...

  4. c语言实现xor加密

    异或运算:^ 定义:它的定义是:两个值相同时,返回false,否则返回true.也就是说,XOR可以用来判断两个值是否不同. 特点:如果对一个值连续做两次 XOR,会返回这个值本身. ^ // 第一次 ...

  5. centos 7 安装python3和pip

    目前,我认为还是使用系统自带的稳定版最好,因为:该版本肯定是centos7开发组深思熟虑的,稳定性好,另外,由于系统自带,兼容性好,第三,和之配套的软件齐全,如果不用系统的,建议还是不要在源码编译安装 ...

  6. asp.net core在linux上的部署调试

    双十一买了阿里云的LINUX服务器三年¥720 把自己的niunan.net一系列网站都部署上去 用jexus来部署,部署时发现头一个网站没问题,但是后一个网站部署就有问题..输入域名打不开,但JEX ...

  7. Atitit  项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx

    Atitit  项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...

  8. iOS求职之C语言面试题

    1.static有什么用途?(请至少说明两种) 1)限制变量的作用域 2)设置变量的存储域(堆,主动分配内存也是堆) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.
 2)  ...

  9. [sql]mysql参数(配置)手册

    my-innodb-heavy-4G.cnf配置文件注解 [client] #客户端 port = 3306 #mysql客户端连接时的默认端口号 socket = /application/mysq ...

  10. xcode代码没颜色的解决方案

    转自:http://blog.csdn.net/jiarusun000/article/details/7527631 今天代码使用了svn后发现项目中的所有原文件都没颜色了... 查找半天后发现是因 ...