一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页
概述
很多地方都存在以Tab页来呈现数据的方式,比如网易、新浪、搜狐、QQ等知名的门户网站的首页,还有大家熟知的博客园首页,都是用了tab页来显示数据。大家之所以喜欢用Tab,因为它能大大的增加显示数据的空间,能在固定的空间中显示更多的数据。分页也是为了方便数据的显示,在应用系统中必不可少。这篇文章使用Jquery在ASP.NET MVC中使用Tab页,以及在Tab页中实现异步无刷新的分页功能。估计这个大家都会用得到的。
在ASP.NET MVC中实现分页,在之前的一篇博文:ASP.NET MVC2右键菜单和简单分页中已经实现了。实现的方式很简单,在table下面加上一段<a/><a/><a/>...的html就行了。
先介绍一个Jquery插件:Tab,可以到http://jqueryui.com/download上下载。看下它自带一个例子的截图:
效果图:
实现
按照它的Demo,在ASP.net mvc项目中引入js和css,以及Jquery。我在ASP.net MVC的母板页中引入这些文件:
<link href="http://www.cnblogs.com/Content/base/ui.all.css" rel="stylesheet" type="text/css" /> <script src="http://www.cnblogs.com/Scripts/jquery-1.4.1.js" type="text/javascript"></script> <script src="http://www.cnblogs.com/Scripts/ui.core.js" type="text/javascript"></script> <script src="http://www.cnblogs.com/Scripts/ui.tabs.js" type="text/javascript"></script>
引入之后,参考它的Demo在MVC项目中View中使用Tab。 可以看到比tab自带的demo多来了一个getContentTab函数。他有两个参数,用于表示你要显示
哪个tab页的第几页数据。这里默认加载的时候,显示tabs-Shoes的第一页数据。
<script type="text/javascript">$(document).ready(function () { $("#tabs").tabs(); getContentTab('Shoes', 1); }); </script> <div id="tabs"> <ul> <li><a href="#tabs-Shoes" onclick="getContentTab('Shoes',1);">Shoes</a></li> <li><a href="#tabs-Electronics" onclick="getContentTab('Electronics',1);">Electronics</a></li> <li><a href="#tabs-Food" onclick="getContentTab('Food',1);">Food</a></li> </ul> <div id="tabs-Shoes"> </div> <div id="tabs-Electronics"> </div> <div id="tabs-Food"> </div> </div>
当然在定义View之前要先写好控制器的代码,很简单,基本上没有代码:
public ActionResult ViewCategory(){return View();}
好了,下面开始我们重要的几步。显示table以及实现table的分页。这个demo的tab定义了三个tab页,每一页的table结构是一样的,所以我定义一个用户控件来实现table和分页。代码如下:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcAjaxPaging.Models.ProductViewModel>" %><%@ Import Namespace="MvcAjaxPaging.HtmlHelpers"%> <table class="grid"> <thead> <tr> <th>Product name</th> <th>Category</th> </tr> </thead> <tbody><% foreach (var product in ViewData.Model.Products) { %> <tr> <td><%= product.Name %></td> <td><%= product.Category %></td> </tr><% } %> </tbody> </table> <div class="pager"><%= Html.Pager(ViewData.Model.PagingInfo.CurrentPage, ViewData.Model.PagingInfo.ItemsPerPage, ViewData.Model.PagingInfo.TotalItems, "", ViewData["CategoryDisplayName"] as string)%> </div>
我们再通过一个ajax调用来将这个控件显示在ViewCategory对应的View上,定义一个js函数:
function getContentTab(categoryName, page) { var url = '<%= Url.Content("~/MyPaging/ViewByCategory/") %>' + categoryName + "/" + page;var targetDiv = "#tabs-" + categoryName; $.get(url, null, function (result) { $(targetDiv).html(result); });}
我们看上面代码,我们去请求服务端的ViewByCategory方法,获取table中的数据。看ViewByCategory的代码:
public ActionResult ViewByCategory(string categoryName, int? page){ categoryName = categoryName ?? this.categories[0];int currentPageIndex = page.HasValue ? page.Value : 0;ProductViewModel productViewModel = new ProductViewModel(); IList<Product> productsByCategory = this.allProducts.Where(p => p.Category.Equals(categoryName)).ToList(); productViewModel.Products = productsByCategory.Skip((currentPageIndex - 1) * 10).Take(10).ToList(); productViewModel.PagingInfo.CurrentPage = currentPageIndex; productViewModel.PagingInfo.ItemsPerPage = 10; productViewModel.PagingInfo.TotalItems = productsByCategory.Count;return View("ViewByCategoryTable", productViewModel);}
为了简单起见数据来来自内存,使用list的take来实现分页。你可以很方便的改成从DB获取数据。在看下如何生成分页的html,其实很简单,我们只要在生成的分页的HTML中使用getContentTab函数就行了。
public static string Pager(this HtmlHelper helper, int currentPage, int currentPageSize, int totalRecords,string urlPrefix,string status){StringBuilder sb1 = new StringBuilder(); int seed = currentPage % currentPageSize == 0 ? currentPage : currentPage - (currentPage % currentPageSize); if (currentPage > 0) sb1.AppendLine(String.Format("<a href='#' οnclick=getContentTab(\"{0}\",\"{1}\") >Previous</a>", status, currentPage)); if (currentPage - currentPageSize >= 0) sb1.AppendLine(String.Format("<a href='#' οnclick=getContentTab(\"{0}\",\"{1}\") >...</a>", status, (currentPage - currentPageSize) + 1)); for (int i = seed; i < Math.Round((totalRecords / currentPageSize) + 0.5) && i < seed + currentPageSize; i++) { sb1.AppendLine(String.Format("<a href='#' οnclick=getContentTab(\"{0}\",\"{1}\") >{1}</a>", status, i + 1)); } if (currentPage + currentPageSize <= (Math.Round((totalRecords / currentPageSize) + 0.5) - 1)) sb1.AppendLine(String.Format("<a href='#' οnclick=getContentTab(\"{0}\",\"{1}\") >...</a>", status, (currentPage + currentPageSize) + 1)); if (currentPage < (Math.Round((totalRecords / currentPageSize) + 0.5) - 1)) sb1.AppendLine(String.Format("<a href='#' οnclick=getContentTab(\"{0}\",\"{1}\") >Next</a>", status, currentPage + 2)); return sb1.ToString();}
效果
总结:在asp.net mvc中实现了在tab页中的异步无刷新分页。这东西太常用了,放在这里,希望对你有所帮助。
代码:http://cid-aef1e64945224a20.office.live.com/self.aspx/.Public/MvcAjaxPaging.rar
转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2158643.html
一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页相关推荐
- 一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案
通过好友CallHot介绍Lodopweb打印控件.由于是国人开发的,故这两天认真了研究下,打算在未来的项目中使用.现将学习成果与园友分享.如果存在不足的地方,希望您指出. 具体的实现步骤如下: 一. ...
- Asp.Net MVC2.0 Url 路由入门---实例篇
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- Asp.net MVC2.0系列文章-MVC简介篇
使用微软VS工具开发Web应用程序主要有两种方式:一种是常用的创建Asp.net Web Forms,另外一种就是今天着重介绍的Asp.net MVC. <?XML:NAMESPACE PRE ...
- Asp.net MVC2.0系列文章-运行Web MVC2.0 Demo
安装VS2010 首先安装VS2010,安装过程请参考文章: http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html. 创建第一个MVC ...
- Asp.net MVC2.0系列文章-编辑和删除新闻操作
上一篇文章,我们简单地完成了新闻内容的展示功能(Asp.net MVC2.0系列文章-显示列表和详细页面操作),此篇文章,我们使用Asp.net MVC2.0实现新闻记录的编辑和删除功能. 创建Vie ...
- Asp.Net无刷新分页( jquery.pagination.js)
采用Jquery无刷新分页插件jquery.pagination.js 实现无刷新分页效果 友情提示:本示例Handler中采用StringBuilder的append方法追加HTML,小数据量可 ...
- ASP.NET 2.0数据教程之二十六::排序自定义分页数据
导言 和默认翻页方式相比,自定义分页能提高几个数量级的效率.当我们的需要对大量数据分页的时候就需要考虑自定义分页,然而实现自定义分页相比默认分页需要做更多工作.对于排序自定义分页数据也是这样,在本教程 ...
- Professional ASP.NET 2.0之跨页提交-Cross Page Posting
先看代码 Listing 3-9: Page1.aspx VB <%@ Page Language="VB" %> <!DOCTYPE html PUBLIC & ...
- 简单的ASP.NET无刷新分页
1.新建一个分页存储过程: CREATE procedure [dbo].[P_Pager] (@PageNumber int, @PageSize int) as declare @sql nvar ...
最新文章
- (转载)IIS安装配置全过程
- 柜位预測(一)——显示柜位曲线图
- 汇编语言--iret指令
- 如何看exe文件源代码_杀进程、删文件...看新型勒索软件RobbinHood如何干掉杀毒软件...
- c++ 在multimap中查找关键字的程序举例
- 关于jdk1.5之后的自定拆装箱
- 【1】C++语法与数据结构之C语言学生管理系统转C++学生管理系统
- 用sitemesh来装饰动态的左侧菜单和内容部分
- android手机usb设置在哪里,手机usb调试在哪,教您安卓手机怎么打开USB调试
- 快速查询hive数据仓库表中的总条数
- 关于yolov5出现报错 KeyError: ‘copy_paste‘之类Key问题解决办法
- 漫话:如何给女朋友解释灭霸的指响并不是真随机消灭半数宇宙人口的?
- [转载]iOS开发之第三方登录QQ
- iOS直播类APP开发流程解析
- html收藏导入浏览器,分享星愿浏览器导入和导出收藏夹方法
- Word加粗的字体如何恢复正常粗细
- Odoo产品分析 (三) -- 人力资源板块(4) -- 招聘流程(1)
- Linux安装围棋AI(q5go和katago)
- CSS,给你点“颜色“看看
- 校盈家学校财务收费管理软件,最适合学校财务收费的管理工具!
热门文章
- PAT乙级 1038 统计同成绩学生(map的解法)
- 编程实现newton插值c++_数据体操:数据处理和IDW地理插值算法
- 双向链表中插入结点并输出
- h5打开麦克风权限录音_原来电脑上自带录音功能,很多人还不知道,真的太实用了...
- jdk源码——HashMap
- ipython的使用
- 我的angularjs源码学习之旅1——初识angularjs
- Sql Server REPLACE函数的使用
- (Mark)JS中的上下文
- Fabric学习笔记(一)- Centos 7下的Fabric 2.3.2环境搭建