zoukankan      html  css  js  c++  java
  • 发布一个从webform改进而来的asp.net mvc分页工具类

    我在前面的博客里曾经再次总结过一个webform下使用极广的分页辅助类。本文总结一下asp.net mvc下的简单分页工具类,对于需要从事mvc开发的朋友可以参考一下。这个分页辅助类本质上就是直接使用webform下的分页工具类,再配合HtmlHelper扩展方法稍加改进和包装。所有分页过程可以省却很多代码,而且在View(页面)里调用和webform的方式差不多,使用很方便。

    1、webform下的一个分页辅助类

    关于webform下的分页工具类的具体使用介绍,您可以参考这一篇

    使用的时候,需要初始化样式,在web.config下可以添加配置:

      <appSettings>
        <!--分页样式-->
        <add key="PagerStyle" value="PagerCss"/>
      </appSettings>

    2、AspNetMvcPager静态类

    这个静态类是对MVC下的HtmlHelper添加几个生成分页tag的扩展方法:

    using System.Collections.Specialized;
    using System.Text;
    
    namespace System.Web.Mvc
    {
        using DotNet.Common.WebForm;
    
        public static class AspNetMvcPager
        {
            public static string RenderPager(this HtmlHelper helper, int leftSize, int currentPage, int recordsPerPage, int totalCount, System.Web.HttpRequest request)
            {
                string url = GenerateURL(request);
                AspNetPagerControl ctrl = new AspNetPagerControl(currentPage, recordsPerPage, totalCount, leftSize, url);
                string pagerStr = AspNetPagerControl.RenderPager(ctrl);
                return GeneratePagerString(pagerStr);
            }
    
            public static string RenderPager(this HtmlHelper helper, int leftSize, int currentPage, int recordsPerPage, int totalCount, string baseString)
            {
                AspNetPagerControl ctrl = new AspNetPagerControl(currentPage, recordsPerPage, totalCount, leftSize, baseString);
                string pagerStr = AspNetPagerControl.RenderPager(ctrl);
                return GeneratePagerString(pagerStr);
    
            }
    
            public static string RenderStatisticPager(this HtmlHelper helper, int leftSize, int currentPage, int recordsPerPage, int totalCount, System.Web.HttpRequest request)
            {
                string url = GenerateURL(request);
                AspNetPagerControl ctrl = new AspNetPagerControl(currentPage, recordsPerPage, totalCount, leftSize, url);
                string pagerStr = AspNetPagerControl.RenderStatisticPager(ctrl);
                return GeneratePagerString(pagerStr);
            }
    
            public static string RenderStatisticPager(this HtmlHelper helper, int leftSize, int currentPage, int recordsPerPage, int totalCount, string baseString)
            {
                AspNetPagerControl ctrl = new AspNetPagerControl(currentPage, recordsPerPage, totalCount, leftSize, baseString);
                string pagerStr = AspNetPagerControl.RenderStatisticPager(ctrl);
                return GeneratePagerString(pagerStr);
            }
    
            private static string GenerateURL(System.Web.HttpRequest request)
            {
                StringBuilder url = new StringBuilder();
                url.Append(request.Url.AbsolutePath);
                NameValueCollection collection = request.QueryString;
                string[] keys = collection.AllKeys;
                int counter = 0;
                for (int i = 0; i < keys.Length; i++)
                {
                    if (keys[i].ToLower() == "pageindex")
                    {
                        continue;
                    }
                    url.AppendFormat("{0}{1}={2}", (counter == 0 ? "?" : "&"), keys[i], collection[keys[i]]);
                    counter++;
                }
                return url.ToString();
            }
            private static string GeneratePagerString(string pagerStr)
            {
                TagBuilder builder = new TagBuilder("div");
                builder.IdAttributeDotReplacement = "_";
                builder.GenerateId(System.Guid.NewGuid().ToString());
                builder.InnerHtml = pagerStr;
                return builder.ToString();
            }
        }
    }
    

    3、控制器里查询和传参

    在控制器里,view里有时候是通过点击查询按钮(POST方式)进行搜索的,有时候是点击分页链接通过url传参的(GET方式),所以控制查询条件和正确分页,都要在ctroller里做好。本文的示例代码给的代码相当简单,分页参数的获取也非常直接,您可以自己分析一下。

    4、页面调用

    和webform下类似,通过<%= %>直接绑定进行页面呈现:

           <%=Html.RenderPager(pager.LeftSize, pager.CurrentPage, pager.RecordsPerPg, pager.TotalCount, HttpContext.Current.Request)%>
         
           <%=Html.RenderStatisticPager(pager.LeftSize, pager.CurrentPage, pager.RecordsPerPg, pager.TotalCount, HttpContext.Current.Request)%>
    
           <%=Html.RenderPager(pager.LeftSize, pager.CurrentPage, pager.RecordsPerPg, pager.TotalCount, string.Format("{0}?firstname={1}&lastname={2}", HttpContext.Current.Request.Url.AbsolutePath,pager.FirstName,pager.LastName))%>
         
           <%=Html.RenderStatisticPager(pager.LeftSize, pager.CurrentPage, pager.RecordsPerPg, pager.TotalCount, string.Format("{0}?firstname={1}&lastname={2}", HttpContext.Current.Request.Url.AbsolutePath, pager.FirstName, pager.LastName))%>
    

    总体来说,使用起来非常简单,其中传参和url的确定是重点。

    需要说明的是,mvc和webform非常明显不同的一个地方,就是mvc对url 进行了重写,一不小心就可能造成404错误发生的惨剧,所以您在传参的时候务必注意。

    有图有真相:

    mvcpager

    示例下载:MvcApp

  • 相关阅读:
    转:SVN常见问题与解决方法
    Mac OS 下的解压缩软件——The Unarchiver
    Django报错 The serializer field might be named incorrectly and not match any Got AttributeError when attempting to get a value for field `author_for` on serializer `KnownledgeBaseListSerializer`
    Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'
    webstorm不能中文输入问题
    npm报错This is probably not a problem with npm. There is likely additional logging
    Django 报错no sucn column: OpretionalError
    Python 报错 AttributeError: module 'django.db.models' has no attribute 'SubfieldBase'
    详解Django中Request对象的相关用法
    Python中import, from...import,import...as的区别
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1925011.html
Copyright © 2011-2022 走看看