一起谈.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='#' onclick=getContentTab(\"{0}\",\"{1}\") >Previous</a>", status, currentPage));

if (currentPage - currentPageSize >= 0)        sb1.AppendLine(String.Format("<a href='#' onclick=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='#' onclick=getContentTab(\"{0}\",\"{1}\") >{1}</a>", status, i + 1));    }

if (currentPage + currentPageSize <= (Math.Round((totalRecords / currentPageSize) + 0.5) - 1))        sb1.AppendLine(String.Format("<a href='#' onclick=getContentTab(\"{0}\",\"{1}\") >...</a>", status, (currentPage + currentPageSize) + 1));

if (currentPage < (Math.Round((totalRecords / currentPageSize) + 0.5) - 1))        sb1.AppendLine(String.Format("<a href='#'  onclick=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

时间: 2024-11-05 16:39:08

一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页的相关文章

ASP.NET MVC2.0在Tab页中实现异步无刷新分页

概述 很多地方都存在以Tab页来呈现数据的方式,比如网易.新浪.搜狐.QQ等知名的门户网站的首页,还有大家熟知的博客园首页,都是用了tab页来显示数据.大家之所以喜欢用Tab,因为它能大大的增加显示数据的空间,能在固定的空间中显示更多的数据.分页也是为了方便数据的显示,在应用系统中必不可少.这篇文章使用Jquery在ASP.NET MVC中使用Tab页,以及在Tab页中实现异步无刷新的分页功能.估计这个大家都会用得到的. 在ASP.NET MVC中实现分页,在之前的一篇博文:ASP.NET MV

一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案

通过好友CallHot介绍Lodopweb打印控件.由于是国人开发的,故这两天认真了研究下,打算在未来的项目中使用.现将学习成果与园友分享.如果存在不足的地方,希望您指出. 具体的实现步骤如下: 一.准备工作   1.MVC2.0 + jQuery1.4.1 开发环境. 2.Lodop web 打印控件,官方地址:http://mtsoftware.v053.gokao.net/download.html  (注:国人开发,免费软件). 3.StringTemplate,C#开源模板引擎.官方地

一起谈.NET技术,在MVC2.0 中 遭遇无法被 Try Catch 的 “Exception”

前天当我为新项目新增完日志模块后对日志模块进行测试,测试时居然发现开发人员一段非常简单的代码,而且很标准的try ... catch .. 写法.代码整理如下: public JsonResult SaveTest(){try {//LinqToSql:返回IQueryable数据集合. var iQueryableData = (from o in _Context.Orders//.Where(o => o.OrderID == 10248) select new { ShipName =

Asp.Net MVC2.0 Url 路由入门

     本篇文章是初识Asp.Net MVC2.0 的后续的介绍.此文将从Routing未开放源代码开始,还会对Asp.Net的Url重写技术做个简单介绍.并简单介绍Asp.Net MVC2.0 Url路由技术的使用.      Url路由是MVC很重要的核心的一部分.不过它是单独于MVC项目,而且没有开源.它作为微软的一个独立的项目抽取了出来,在Asp.Net MVC中只是引用了这个dll.新建一个MVC Web项目,打开Global.asax.我们看到系统帮我们添加了using Syste

Asp.Net MVC2.0 Url 路由入门---实例篇

     本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术.      接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的View的呢?Controller和Action是怎么解析的?这就是Routing组件干的事情了.      Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Ac

初识Asp.Net MVC2.0【续】

    之前写了点Asp.Net MVC的概念,没有实际上系统的介绍Asp.Net MVC开发方式与WebFrom 开发方式的区别.昨晚上看了访问自己blog的入口的搜索关键词大部分是冲着MVC来的,就有了冲动将自己浅薄的知识写在这里,供初学者有个浅显的认识.欢迎高手拍砖指导,希望能把一篇入门的文章写的尽善尽美. WebFrom的一个事件开发模型     浏览者发送一个url请求,如果不在使用url重写机制或静态化技术的话,url请求的是具体一个xx.aspx页面.iis将url请求交给.Net

Asp.net MVC2.0系列文章-运行Web MVC2.0 Demo

安装VS2010 首先安装VS2010,安装过程请参考文章: http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html. 创建第一个MVC2.0程序 新建一个asp.net MVC2.0网站程序,如下图: 提示是否新建单元测试工程,选择创建Unit Test Project MVC2.0网站结构图

Asp.net MVC2.0系列文章-显示列表和详细页面操作

上一篇文章,我们简单地完成了新闻的添加操作(Asp.net MVC2.0系列文章-添 加操作)此篇文章,我们使用Asp.net MVC2.0实现新闻清单的展示和新闻详细页面 . 创建View视图Index和NewsDetails 创建新闻首页,用来显示新闻列表. 在Views/News目录下,单击右键,选择Add->View,修改相关配置如下图所 示 在生成的HTML代码中,进行相关展示方面的修改.主要代码如下: <% foreach (var item in Model) { %> &

asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

 本篇文章主要是对asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码进行了介绍,需要的朋友可以过来参考下,需要对大家有所帮助  代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxJson.aspx.cs" Inherits="AjaxJson" %> <!DOCTYPE html PUBLIC &quo