ASP.NET MVC 分页使用的是做者杨涛的MvcPager分页控件 地址:http://www.webdiyer.com/mvcpager/demos/ajaxpaging/web
这个分页控件在里面有很好的的案例,及注意事项ajax
分页在咱们的项目中是常常须要使用到的,普通分页体验是在是太差了,每一次点击下一步,会形成页面刷新,本身都看不过去了 ,O(∩_∩)O哈哈~bootstrap
因此此次咱们要使用这个控件在作一个MvcPager的异步分页,分页的时候咱们只刷新表格,而不是刷新页面数组
下面咱们开始吧服务器
首先咱们须要建立一个ASP.NET MVC的项目,具体怎么建立就不细说了mvc
以后咱们须要引入 控件的dll文件app
我是在官网下的案例,直接引用的,异步
固然大家也能够从NuGet包中引用函数
找到项目,点击右键会有一个管理NuGet程序包,咱们打开它布局
输入Webdiyer找到,并安装
实体类
Article.cs
public class Article { [Display(Name = "文章编号")] public int ID { get; set; } [Display(Name = "文章标题")] [MaxLength(200)] public string Title { get; set; } [Display(Name = "文章内容")] public string Content { get; set; } [Display(Name = "发布日期")] public DateTime PubDate { get; set; } [Display(Name = "做者")] [MaxLength(20)] public string Author { get; set; } [Display(Name = "文章来源")] [MaxLength(20)] public string Source { get; set; } }
Cotroller
public ActionResult AjaxPaging(int id = 1) { using (var db = new DataContext()) { var model = db.Articles.OrderByDescending(a => a.PubDate).ToPagedList(id, 5);
//判断是不是AJAX请求,若是为true,就返回分部视图 if (Request.IsAjaxRequest()) return PartialView("_ArticleTable", model); return View(model); } }
应该能够看到,咱们引用了这个分页控件的时候,咱们返回的不在是List<T>,而是PagedList<T>
后面的ToPagedList(起始页,每页显示条数),起始页须要咱们在本方法中定义int id=1
View:
@model PagedList<MVCPager_Text.Models.Article> @using Webdiyer.WebControls.Mvc; //这个ID就是咱们在分页须要来更新的ID <div id="articles"> @Html.Partial("_ArticleTable", Model) </div> @section scripts { @{Html.RegisterMvcPagerScriptResource();}
//这句话是必须的,用来注册MVCPager,若是没有可能形成Ajax请求无反应 }
在视图中咱们引用的集合一样也是PagedList<T>
@section scripts
{
@{Html.RegisterMvcPagerScriptResource();}
//这句话是必须的,用来注册MVCPager,若是没有可能形成Ajax请求无反应
}
注意:咱们的视图是默认使用布局页 layout
咱们不能使布局页为Null @{ layout=null} ,这样会使咱们的异步分页无效,咱们到控制器的Requset.isAjaxRequset()这一块会一直是false
建立分部视图:
建立完分布页,里面的使咱们须要展现的表格
_ArticleTable:
@model PagedList<MVCPager_Text.Models.Article> @using Webdiyer.WebControls.Mvc; <table class="table table-bordered table-striped"> <tr> <th class="nowrap">序号</th> <th> @Html.DisplayNameFor(model => model.Title) </th> <th> @Html.DisplayNameFor(model => model.PubDate) </th> <th> @Html.DisplayNameFor(model => model.Author) </th> <th> @Html.DisplayNameFor(model => model.Source) </th> </tr> @{ int i = 0;} @foreach (var item in Model) { <tr> <td>@(Model.StartItemIndex + i++)</td> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.PubDate) </td> <td> @Html.DisplayFor(modelItem => item.Author) </td> <td> @Html.DisplayFor(modelItem => item.Source) </td> </tr> } </table> <div class="text-center"> @Ajax.Pager(Model, new PagerOptions { PageIndexParameterName = "id", ContainerTagName = "ul", CssClass = "pagination", CurrentPagerItemTemplate = "<li class=\"active\"><a href=\"#\">{0}</a></li>", DisabledPagerItemTemplate = "<li class=\"disabled\"><a>{0}</a></li>", PagerItemTemplate = "<li>{0}</li>" }).AjaxOptions(a => a.SetUpdateTargetId("articles")) </div>
其中须要注意的是:
PageIndexParameterName是咱们控制器中的参数id,须要保持一致
咱们须要使用的是@Ajax.Pager(),而不是@Html.Pager
AjaxOptions(a => a.SetUpdateTargetId("articles")) 在官网的意思是用于构建MvcAjaxOptions对象的方法
咱们再来看一下
MvcAjaxOptions对象
UpdateTargetId:获取或设置要使用服务器响应来更新的 DOM 元素的 ID。这个参数ID就使咱们在视图中div的Id
上面咱们用的是AjaxOptions(a => a.SetUpdateTargetId("articles"))这个写法,
MvcAjaxOptions对象怎么使用呢
@Ajax.Pager(Model, new PagerOptions { PageIndexParameterName = "id", ContainerTagName = "ul", CssClass = "pagination", CurrentPagerItemTemplate = "<li class=\"active\"><a href=\"#\">{0}</a></li>", DisabledPagerItemTemplate = "<li class=\"disabled\"><a>{0}</a></li>", PagerItemTemplate = "<li>{0}</li>" },new MvcAjaxOptions {UpdateTargetId= "RecordList" })
经过上面这些咱们的异步分页就已经作完了
二.复选框选中
当咱们点击上一页或者下一页的时候咱们须要保持以前的复选框状态,
并不会由于咱们点击上一页或者下一页而改变状态
复选框选中的前提就是咱们须要异步刷新,只刷新表格,不刷新页面
在这个分页控件上,有咱们须要的对象
MvcAjaxOptions对象
来看一下这个对象中咱们须要用到的属性,一共只有两个属性咱们能够用到:
OnBegin:获取或设置要在更新页面以前当即调用的 JavaScript 函数的名称。
OnSuccess:获取或设置在成功更新页面以后要调用的 JavaScript 函数。
Code奉上:
分页中咱们须要在MvcAjaxOptions中添加这两个属性,一个是在更新页面以前调用的js函数(OnBegin),一个是在更新页面以后调用的JS函数(OnSuccess)
@Ajax.Pager(Model, new PagerOptions { PageIndexParameterName = "id", NumericPagerItemCount = 5, CssClass = "pagination", CurrentPagerItemTemplate = "<li class=\"active\"><a href=\"#\">{0}</a></li>", DisabledPagerItemTemplate = "<li class=\"disabled\"><a>{0}</a></li>", PagerItemTemplate = "<li>{0}</li>", Id = "bootstrappager" },new MvcAjaxOptions { OnBegin= "GetCheckbox()",OnSuccess= "OnSuccess" } ).AjaxOptions(a => a.SetUpdateTargetId("RecordList").SetDataFormId("searchForm"))
GetCheckbox()函数
//定义一个数组来存储,选中的ID
var select = new Array;
function GetCheckbox() {
//.single是复选框的class $(".single").each(function () {
//判断复选框的状态,若是选中为true if ($(this).prop('checked')) {
//判断选中的复选框的val()值是否存在在该数组中select var index = $.inArray($(this).val(), select);
//不存在则会返回-1,不存在向数组中写入 if (index == -1) { select.push($(this).val()) } } else {
//若是没有选中,有可能会取消选中,咱们要判断当前的页面没有选中的$(this).val()值是否在数组中select var index = $.inArray($(this).val(), select);
//若是存在则会返回存在数值在数组中的下标 if (index >= 0) { //删除该下标的值 select.splice(index); } } }) }
OnSuccess();
function OnSuccess() { $(".single").each(function () { //当更新成功以后,咱们须要判断当前页面的复选框的$(this).val()是否存在于数组中select var index = $.inArray($(this).val(), select)
//存在则返回下标 if (index >= 0) { // console.log("index=" + index + ",select[Index]=" + select[index])
若是$(this).val()的值与数组中下标的值相同,则给它处于选中状态 if ($(this).val() == select[index]) { $(this).prop('checked', 'checked'); } } }) }
这样就能够实现复选的选中,
不过须要注意的是:
当我第一次加载进入页面的时候,就算你选中几个复选框,数组中也是没有数据的
由于只有你点击下一页或者是上一页的时候才会触发函数,
因此咱们也须要在不点击的时候进行当前页的一个复选框的选中断定
当我进入这个页面,选中复选框以后,就点击按钮的时候也须要进行选中