ASP.NETMVC 分页
<div class="text-center">
<span style="display:inline-block; position:relative;top:-30px;">共 @Model.TotalPageCount 页 @Model.TotalItemCount 条记录,当前为第 @Model.CurrentPageIndex 页</span>
@Ajax.Pager(Model, new PagerOptions
{
/*
* 设置分页显示的样式
*/
FirstPageText = "首页",
LastPageText = "最后一页",
NextPageText = "下一页",
PrevPageText = "上一页",
PageIndexParameterName = "PageId",
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
{
HttpMethod = "post",
UpdateTargetId = "partList",//更新数据的标签ID
DataFormId = "form0" //分页对应的条件搜索表单ID
})
</div>
这是前台页面,直接复制到前台最下面即可!
This file is part of MvcPager.
Copyright 2009-2015 Webdiyer(http://en.webdiyer.com)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
var Webdiyer = Webdiyer || {};
Webdiyer.MvcPagers = [];
Webdiyer.MvcPagers.getById = function (id) {
for (var i = 0; i <= this.length; i++) {
if (typeof this[i] !== "undefined" && this[i].id === id) {
return this[i];
}
}
return null;
};
Webdiyer.__ajaxPages = {}; //Ajax page parameters, preventing multiple MvcPager with same UrlPageIndexName trigger multiple http requests
this.wrapper = wrapper;
};
wrapper: null,
id: null,
urlFormat: null,
pageIndexName: null,
updateTarget: null,
onBegin: null,
onComplete: null,
onFailure: null,
onSuccess: null,
httpMethod: null,
confirm: null,
loadingElementId: null,
loadingDuration: 0,
partialLoading: null,
currentPageIndex: null,
dataFormId: null,
allowCache: true,
enableHistorySupport: null,
//autoSubmitForm: null,
searchCriteria: null,
pageCount: null,
invalidPageErrMsg: null,
outOfRangeErrMsg: null,
firstPageUrl: null,
pageIndexBox: null,
goToButton: null,
maxPageIndexItems: 20,
isAjaxPager: null,
onError: null,
isFirstLoading: true,
allowReload: false, //used by search form to check if reload is needed even current page index is not changed
init: function () {
var wrapper = $(this.wrapper);
var newPageIndex = 1;
var initialPageIndex; //value of the page index when page is loaded first time, if go back to this page we need to load the correct data by checking this value(it's not necessarily to be 1)
this.id = wrapper.attr("id");
this.isAjaxPager = wrapper.data("ajax") || false;
this.pageCount = wrapper.data("pagecount");
this.invalidPageErrMsg = wrapper.data("invalidpageerrmsg");
this.outOfRangeErrMsg = wrapper.data("outrangeerrmsg");
this.firstPageUrl = wrapper.data("firstpage");
this.urlFormat = wrapper.data("urlformat");
this.pageIndexName = wrapper.data("pageparameter");
this.currentPageIndex = wrapper.data("currentpage") || 1;
this.pageIndexBox = wrapper.data("pageindexbox");
this.goToButton = wrapper.data("gotobutton");
this.maxPageIndexItems = wrapper.data("maxitems") || 20;
this.onError = wrapper.data("onerror") || "alert(errMsg)";
var context = this;
if (this.isAjaxPager) {
this.updateTarget = wrapper.data("ajax-update");
this.onBegin = wrapper.data("ajax-begin");
this.onComplete = wrapper.data("ajax-complete");
this.onFailure = wrapper.data("ajax-failure");
this.onSuccess = wrapper.data("ajax-success");
this.confirm = wrapper.data("ajax-confirm") || undefined;
this.httpMethod = wrapper.data("ajax-method") || "GET";
this.loadingElementId = wrapper.data("ajax-loading") || undefined;
this.dataFormId = wrapper.data("ajax-dataformid") || undefined;
this.allowCache = wrapper.data("ajax-allowcache") || true;
var history = wrapper.data("ajax-enablehistorysupport");
this.enableHistorySupport = (typeof history === "undefined" ? true : history);
//this.autoSubmitForm = wrapper.data("ajax-autosubmitform") || false;
this.loadingDuration = wrapper.data("ajax-loading-duration") || 0;
this.partialLoading = wrapper.data("ajax-partialloading") || false;
initialPageIndex = this.currentPageIndex;
var pagerSelector = "[data-pagerid='Webdiyer.MvcPager']";
var hashIndex = this.__getPageIndex(this.pageIndexName);
if (hashIndex !== this.currentPageIndex && hashIndex > 0)
{ this.__ajax(hashIndex, { type: this.httpMethod, data: [] }); }
if (typeof this.dataFormId !== "undefined") {
var isAjaxForm = $(context.dataFormId).data("ajax") || false;
$(context.dataFormId).submit(function (event) {
context.searchCriteria = $(context.dataFormId).serializeArray();
if (isAjaxForm) {
if (context.currentPageIndex !== 1) {
context.currentPageIndex = 1;
if (context.enableHistorySupport) {
context.__setPageIndex(context.pageIndexName, -1); //prevent reloading triggered by hashchange event
context.allowReload = true;
} else {
context.__ajax(1, { type: context.httpMethod, data: [] });
}
} else {
if (typeof Webdiyer.__ajaxPages[context.pageIndexName] === "undefined")
{ context.allowReload = true; }
}
} else {
if (typeof Webdiyer.__ajaxPages[context.pageIndexName] === "undefined")
{ context.allowReload = true; }
if (context.currentPageIndex === 1) {
context.__ajax(1, { type: context.httpMethod, data: [] });
} else {
if (context.enableHistorySupport) {
context.__setPageIndex(context.pageIndexName, 1);
} else {
context.__ajax(1, { type: context.httpMethod, data: [] });
}
context.currentPageIndex = 1;
} context.allowReload = true;
event.preventDefault();
}
});
}
if (this.enableHistorySupport) {
this.__initHashChange(initialPageIndex);
}
//pagination items
$(this.updateTarget).on("click", pagerSelector + " a[data-pageindex]", function (e) {
newPageIndex = $(this).data("pageindex");
e.preventDefault();
if (context.enableHistorySupport) {
context.__setPageIndex(context.pageIndexName, newPageIndex);
} else {
context.__ajax(newPageIndex, { type: context.httpMethod, data: [] });
}
});
}
//page index box
this.__bindPageIndexBox();
return this;
},
__bindPageIndexBox: function () {
var context = this;
if (context.isAjaxPager) {
if ($.trim(context.pageIndexBox) !== "") {
if ($(context.updateTarget).find(context.pageIndexBox).length > 0) {
//page index box is inside of update target area
//check if page index box is dropdownlist and fill it with page indices
context.__fillPageIndexBox();
if ($(context.pageIndexBox).is('input:text')) {
$(context.pageIndexBox).val(context.currentPageIndex);
$(context.updateTarget).on("keydown", context.pageIndexBox, function () {
context.__validateInput(event);
});
}
if ($.trim(context.goToButton) !== "") {
$(context.updateTarget).on("click", context.goToButton, function () {
var newPageIndex = $(context.pageIndexBox).val();
context.goToPage(newPageIndex);
});
} else {
$(context.updateTarget).on("change", context.pageIndexBox, function () {
var newPageIndex = $(context.pageIndexBox).val();
context.goToPage(newPageIndex);
});
}
} else {
//page index box is outside of update target area
context.__bindBoxEvents();
}
}
} else {
//page index box
if ($.trim(context.pageIndexBox) !== "") {
context.__bindBoxEvents();
}
}
},
__bindBoxEvents: function () {
var context = this;
context.__fillPageIndexBox();
if ($(context.pageIndexBox).is('input:text')) {
$(context.pageIndexBox).val(context.currentPageIndex);
$(context.pageIndexBox).keydown(function () {
context.__validateInput(event);
});
}
if ($.trim(context.goToButton) !== "") {
$(context.goToButton).click(function () {
var newPageIndex = $(context.pageIndexBox).val();
context.goToPage(newPageIndex);
});
} else {
$(context.pageIndexBox).change(function () {
var newPageIndex = $(context.pageIndexBox).val();
context.goToPage(newPageIndex);
});
}
},
__fillPageIndexBox: function () {
var se = $(this.pageIndexBox);
if (se.prop('type') === 'select-one') {
se.empty();
var startIndex = this.currentPageIndex - (this.maxPageIndexItems / 2);
if (startIndex + this.maxPageIndexItems > this.pageCount)
{ startIndex = this.pageCount + 1 - this.maxPageIndexItems; }
if (startIndex < 1)
{ startIndex = 1; }
var endIndex = startIndex + this.maxPageIndexItems - 1;
if (endIndex > this.pageCount)
{ endIndex = this.pageCount; }
for (var i = startIndex; i <= endIndex; i++) {
se.append('<option value="' + i + '">' + i + '</option>');
}
}
se.val(this.currentPageIndex);
},
__initHashChange: function (initialPageIndex) {
var context = this;
var docMode = document.documentMode;
if ("onhashchange" in window &&
(docMode === undefined || docMode > 7)) //IE compatable mode
{
$(window).bind("hashchange", function () {
var pageIndex = context.__getPageIndex(context.pageIndexName);
if (pageIndex === 0)
{ pageIndex = initialPageIndex; } //initial page index in url without hash value,eg. when go back from articles/list/3#id=2 to articles/list/3 initialPageIndex will be 3;
context.__ajax(pageIndex, { type: context.httpMethod, data: [] });
});
} else {
var currentHash = window.location.hash;
setInterval(function () {
var pageIndex = context.__getPageIndex(context.pageIndexName);
if (window.location.hash !== currentHash) {
currentHash = window.location.hash;
if (pageIndex === 0)
{ pageIndex = initialPageIndex; }
context.__ajax(pageIndex, { type: context.httpMethod, data: [] });
}
}, 200);
}
},
__getPageIndex: function (pname) {
var hash = window.location.hash.substring(1);
if ($.trim(hash) !== "") {
var harr = hash.split('&');
for (var i = 0; i < harr.length; i++) {
var hval = harr[i].split("=");
if (hval[0].toString().toLowerCase() === pname.toString().toLowerCase()) {
return parseInt(hval[1]) || 1;
}
}
}
return 0;
},
__setPageIndex: function (pname, pindex) {
var hash = window.location.hash.substring(1);
if ($.trim(hash) === "")
{ window.location.hash = pname + "=" + pindex; }
else {
var r = new RegExp(pname + "=[^&]*", 'i');
if (!r.test(hash))
{ window.location.hash += "&" + pname + "=" + pindex; }
else {
var index = hash.replace(r, pname + "=" + pindex);
window.location.hash = index;
}
}
},
goToPage: function (pageIndex) {
var r = new RegExp("^\\s*(\\d+)\\s*$");
if (!r.test(pageIndex)) {
this.__getFunction(this.onError, ["errType", "errMsg"]).apply(this, [0, this.invalidPageErrMsg]);
return;
} else if (RegExp.$1 < 1 || RegExp.$1 > this.pageCount) {
this.__getFunction(this.onError, ["errType", "errMsg"]).apply(this, [1, this.outOfRangeErrMsg]);
return;
}
if (this.isAjaxPager) {
if (this.enableHistorySupport) {
this.__setPageIndex(this.pageIndexName, pageIndex);
} else {
this.__ajax(pageIndex, { type: this.httpMethod, data: [] });
}
} else {
if (typeof this.firstPageUrl !== "undefined" && this.firstPageUrl !== false && parseInt(pageIndex) === 1)
{ window.self.location.href = this.firstPageUrl; }
else
{ window.self.location.href = decodeURI(this.urlFormat).replace("__" + this.pageIndexName + "__", pageIndex); }
}
},
__ajax: function (index, options) {
var context = this;
if (typeof Webdiyer.__ajaxPages[context.pageIndexName] === "undefined" || Webdiyer.__ajaxPages[context.pageIndexName] !== index || context.allowReload) { //prevent duplicate ajax requests
if (index === -1 || (index === 0 && context.isFirstLoading) || (index === context.currentPageIndex && !context.allowReload)) {
return;
}
if (context.confirm && !(window.confirm(context.confirm))) {
return;
}
$.extend(options, {
url: this.urlFormat.replace("__" + context.pageIndexName + "__", index),
cache: this.allowCache,
beforeSend: function (xhr) {
var formMethod = options.type.toUpperCase();
if (!(formMethod === "GET" || formMethod === "POST")) {
xhr.setRequestHeader("X-HTTP-Method-Override", formMethod);
}
var result = context.__getFunction(context.onBegin, ["xhr"]).apply(this, arguments);
if (result !== false && typeof context.loadingElementId !== "undefined") {
$(context.loadingElementId).show(context.loadingDuration);
}
return result; //Ajax request will be cancelled if return false
},
complete: function () {
if (typeof context.loadingElementId !== "undefined") {
$(context.loadingElementId).hide(context.loadingDuration);
}
context.__fillPageIndexBox();
context.__getFunction(context.onComplete, ["xhr", "status"]).apply(this, arguments);
},
success: function (data) {
if (context.partialLoading)
{ $(context.updateTarget).html($(context.updateTarget, data).html()); }
else
{ $(context.updateTarget).html(data); }
context.currentPageIndex = index;
context.isFirstLoading = false;
context.__getFunction(context.onSuccess, ["data", "status", "xhr"]).apply(this, arguments);
},
error: context.__getFunction(context.onFailure, ["xhr", "status", "error"])
});
if (typeof context.dataFormId !== "undefined") {
context.__pushData(options.data, context.searchCriteria);
}
options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
var method = options.type.toUpperCase();
if (!(method === "GET" || method === "POST")) {
options.type = "POST";
options.data.push({ name: "X-HTTP-Method-Override", value: method });
}
$.ajax(options);
Webdiyer.__ajaxPages[context.pageIndexName] = index;
}
},
__pushData: function (dataArr, dataToPush) {
if (dataToPush !== null && typeof dataToPush !== "undefined") {
for (var i = 0; i < dataToPush.length; i++) {
dataArr.push({ name: dataToPush[i].name, value: dataToPush[i].value });
}
}
},
__getFunction: function (code, argNames) {
var fn = window, parts = (code || "").split(".");
while (fn && parts.length) {
fn = fn[parts.shift()];
}
if (typeof (fn) === "function") {
return fn;
} //onSuccess="functionName"
if ($.trim(code).toLowerCase().indexOf("function") === 0) {
/*jslint evil: true */
return new Function("return (" + code + ").apply(this,arguments);");
} //onSuccess="function(data){alert(data);}"
argNames.push(code);
try {
return Function.constructor.apply(null, argNames); //onSuccess="alert('hello');return false;"
} catch (e) {
alert("Error:\r\n" + code + "\r\n is not a valid callback function");
}
},
__validateInput: function (e) {
var kc;
if (window.event) {
kc = e.keyCode;
}
else if (e.which) {
kc = e.which;
}
var valideKeys = [8, 37, 39, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105];
if (kc !== null && valideKeys.indexOf(kc) < 0) {
if (e.preventDefault) {
e.preventDefault();
}
else {
event.returnValue = false;
}
}
}
};
(function ($) {
$.fn.initMvcPagers = function () {
return this.each(function () {
Webdiyer.MvcPagers.push(new Webdiyer.MvcPager(this).init());
});
};
})(jQuery);
$(function () { $("[data-pagerid='Webdiyer.MvcPager']").initMvcPagers(); });
ASP.NETMVC 分页的更多相关文章
- asp.net分页控件
一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...
- .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)
阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外 ...
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...
- 一步一步搭框架(asp.netmvc+easyui+sqlserver)-03
一步一步搭框架(asp.netmvc+easyui+sqlserver)-03 我们期望简洁的后台代码,如下: using System; using System.Collections.Gener ...
- 一步一步搭框架(asp.netmvc+easyui+sqlserver)-02
一步一步搭框架(asp.netmvc+easyui+sqlserver)-02 我们期望简洁带前台代码,如下: <table id="dataGrid" class=&quo ...
- 一步一步搭框架(asp.netmvc+easyui+sqlserver)-01
一步一步搭框架(asp.netmvc+easyui+sqlserver)-01 要搭建的框架是企业级开发框架,适用用企业管理信息系统的开发,如:OA.HR等 1.框架名称:sampleFrame. 2 ...
- asp.net 分页-自己写分页控件
去年就发表过asp.net 分页-利用后台直接生成html分页 ,那种方法只是单纯的实现了分页,基本不能使用,那时就想写个自己的分页控件,无奈能力有限.最近有点时间了,就自己做出了这个分页控件.我承认 ...
- Winserver2008R2 .netframework4.5 asp.netmvc 访问出现的是文件列表。
Winserver2008R2 .netframework4.5 asp.netmvc 访问出现的是文件列表,服务器需要安装如下的补丁,才可正常访问. http://www.microsoft.com ...
- (转)asp.net分页存储过程
Asp.Net分页存储过程 SQL分页语句 一.比较万能的分页: sql代码: 1 2 3 select top 每页显示的记录数 * from topic where id not in (sel ...
随机推荐
- cesium 之图层管理器篇(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- 安卓开发笔记(十八):实现button按钮事件的三种方法
Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...
- 开源干货!!!.NET Core + JWT令牌认证 + Vue.js(iview-admin) 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!
DncZeus 前言 关于 DncZeus DncZeus = Dnc + Zeus "Dnc"--.Net Core 的缩写: "Zeus"--中文译为宙斯, ...
- AI应用开发实战 - 定制化视觉服务的使用
AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...
- 实现iframe高度自适应
iframe高度自适应使用场景是类似于微博,新闻等点击加载更多这种功能实现,要求iframe的高度能够跟随内容的变化而变化. 父html文件,也就是引用ifram的文件 src="blog/ ...
- JNI实战(三):JNI 数据类型映射
在JNI实战(二):Java 调用 C 我们了解了JNI的静态注册和动态注册.也知道我们应该使用动态注册来进行JNI函数与Java方法之间的映射. 示例的映射表的数组为如下: static JNINa ...
- Exception: Exception caught in workbook destructor. Explicit close() may be required for workbook. 错误解决办法
# 写入表格 writer = pd.ExcelWriter('data.xlsx') new_df.to_excel(writer, sheet_name='sheet', index=True) ...
- chrome谷歌浏览器开发者工具-网络带宽控制
有时候我们想在本地测试一下图片预加载loading的加载情况,如下图: 可无奈一般网络带宽都比较好,基本上看不到效果,图片一下子就加载出来了, 可能这个时候有些小伙伴想到的办法是用定时器延迟加载 其实 ...
- JavaSE:八种基本数据类型
变量: 程序用来存储数据的一块内存空间,程序在运行过程中可以对其存储的数据进行改变,所以叫做变量 常量:相对于变量来说,其值是不可改变的 整数类型(byte short int long) b ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十║Vue基础终篇:传值+组件+项目说明
缘起 新的一天又开始啦,大家也应该看到我的标题了,是滴,Vue基础基本就到这里了,咱们回头看看这一路,如果你都看了,并且都会写了,那么现在你就可以自己写一个Demo了,如果再了解一点路由,ajax请求 ...