菜鸟第一天
作为菜鸟,记录以后可能会使用的到技术会使自己的未来更加轻松。。。。。。。。。。
今天学习了在MVC下实现非插件式分页效果,通过创建一个分页方法,可以实现在任何需要进行分页的MVC页面上进行分页,直接在MVC页面上调用即可,废话不多说,直接上代码:
分页的实现代码:
1 //返回一个拼接后的MvcHtmlString 字符串输出 2 //this HtmlHelper pagehelper表示为MVC中的HTML添加拓展方法 3 //area是在项目中创建了一个区域文件夹 4 //action是函数名 5 //controller是控制器 6 //pagesize是html页面中显示的数量 7 //totalcount是数据库中总数据的行数 8 public static MvcHtmlString PageBarBulider(this HtmlHelper pagehelper, string area, string action, string controller, int pagesize, int totalcount) 9 { 10 //从url参数pageindex获取当前的页索引 11 string currentpageindex = HttpContext.Current.Request.QueryString["pageindex"]; 12 int icurrentPi = 1; 13 //由于第一次进入列表页面不会带有pageindex和pagesize,所以要赋值 14 //当为空的时候赋值1,表示第一次打开时默认获取第一页 15 if (string.IsNullOrEmpty(currentpageindex)) 16 { 17 icurrentPi = 1; 18 } 19 else 20 { 21 icurrentPi = Convert.ToInt32(currentpageindex); 22 } 23 //通过天花板函数根据传过来的totalcount算出有多少页数据 24 decimal pagecount = Math.Ceiling(totalcount / Convert.ToDecimal(pagesize)); 25 26 27 //1.0拼接当前分页控件使用的url,判断是否有区域 28 string areaPix = string.IsNullOrEmpty(area) ? "" : "/"+area; 29 string urlfmt = areaPix + "/" + controller + "/" + action + "?pageindex={0}&pagesize={1}"; 30 31 32 StringBuilder sbhtml = new StringBuilder(200); 33 sbhtml.Append("<div id=pagebar><ul>"); 34 sbhtml.Append("<li><a href=""+string.Format(urlfmt,1,pagesize)+"">首页</a></li>"); 35 sbhtml.Append("<li><a href=""+string.Format(urlfmt,icurrentPi==1?1:icurrentPi-1,pagesize)+"">上一页</a></li>"); 36 for (int i = 1; i <=pagecount; i++) 37 { 38 //如果当前选中,那么添加背景色 39 if (i == icurrentPi) 40 { 41 sbhtml.Append("<li><a style='color:#ff6a00;' href=""+string.Format(urlfmt,i,pagesize)+"">"+i+"<a></li>"); 42 } 43 else 44 { 45 sbhtml.Append("<li><a href="" + string.Format(urlfmt, i, pagesize) + "">" + i + "<a></li>"); 46 } 47 } 48 sbhtml.Append("<li><a href=""+string.Format(urlfmt,icurrentPi==pagecount?pagecount:icurrentPi+1,pagesize)+"">下一页</a></li>"); 49 sbhtml.Append("<li><a href=""+string.Format(urlfmt,pagecount,pagesize)+"">尾页</a></li>"); 50 sbhtml.Append("</ul></div>"); 51 //将拼接好的sbhtml转为字符串形式返回到Razor视图引擎解析 52 return new MvcHtmlString(sbhtml.ToString());
上面写好了获取分页数据的方法,那么现在在某一个任意Razor视图上调用该方法,因为是HTML的拓展方法,那么可以在一个表格后面通过HTML.PageBarBulider(输入5个参数),具体如下:
在上面调用后在第一次调用会出错的,因为View.totalcount还没有从控制器后台返回来,并且在第一次打开页面时要默认分页,所以在后台处理时,我们要先获取数据库中的总行数,同时还要判断如果是第一次打开则默认加载第一页数据,同时,因为在点击上一页和下一页的时候,已把url拼接成格式如下:
sbhtml.Append("<li><a href=""+string.Format(urlfmt,icurrentPi==1?1:icurrentPi-1,pagesize)+"">上一页</a></li>")类似于/Area/Controller/Action/pageindex=1&pagesize=5
所以控制器后台代码同时也要获取点击上一页或下一页的URL,根据URL后面的传递的指定参数从数据库中获取指定的数据,控制器中代码如下:
1 public ActionResult Index() 2 { 3 //获取数据库中的总数据行,传给视图 4 ViewBag.totalcount = categoryBLL.DbSet.Count(); 5 6 //1.0从url获取相关参数 7 string pageindex = Request.QueryString["pageindex"]; 8 string pagesize = Request.QueryString["pagesize"]; 9 //2.0初始化页码和每页显示的数据 10 int ipageindex; 11 int ipagesize; 12 if (int.TryParse(pageindex, out ipageindex) == false) 13 { 14 //如果转换不成功,那么就赋值为1,表示当前的第一页 15 ipageindex = 1; 16 } 17 if (int.TryParse(pagesize, out ipagesize) == false) 18 { 19 ipagesize = 5; 20 } 21 //3.0算出当前分页应该跳过的数据行数 22 int skipcount = (ipageindex - 1) * ipagesize; 23 24 //4.0通过传递过来的参数获取数据库中指定行数据 25 var list = base.categoryBLL.DbSet.OrderByDescending(c => c.c_id).Skip(skipcount).Take(ipagesize).ToList(); 26 27 //5.0EntityMap()方法是将MVC中的自定义的实体转为EF自动生成的实体,同样的,可以通过new匿名来进行转换 28 var listmodeview = list.Select(c => c.EntityMap()); 29 30 return View(listmodeview); 31 }
第一次写博客,有点紧张,有错请指点,不喜勿喷!