最近在写一些web应用了解了一下asp.net mvc发现的确好用,所以直接就干上了。不过在使用asp.net mvc的Razor模板的情况并不向传统webform那样可以使用控件。但从Razor的功能上已经具备相关代替的功能,只是从Razor角度来说不是我们平常说的控件而是子模板。由于Razor可以根据自己需求把功能拆分到子模板中,然后通过RenderPage方法输出。从设计的手段上来看完全可以把分页控件封装成一个子的cshtml,在需要的时候引用上就是了。

作为一个控件的设计其最重要的环节是隔离和独立性,在这方面Razor也考虑得比较周到,通过PageData可以简单地进行模板之间的数据偶合问题。下面通过Razor实现一个简单的分页控件,在实现过程只需要编写一个简单的cshtml的模板即可。在使用上也并不需要引用什么代码或DLL,直接在需要的地方嵌入相关cshtml则可以分页控件的功能。

参数制定

一个控件要输出信息必须制定相关的数据规范,一个简单的分页控件其实只需要两个参数即可以,分别当前页索引和总页数。可以在Razor模板的顶部声音一下数据规范

@{
int pageindex = (int)PageData["pageindex"];
int spitindex = ;
int pagecount = (int)PageData["pagecount"];
}

这两上参数就是告诉使用者在调用RenderPage输入的时候必须带上这两个参数值.

分页URL制定

在一些数据查询中往往在URL上会带上一些相关参数,所以在输入分页URL的时候需要简单地处理一下。

@functions{
public static string GetUrl(int index)
{
System.Collections.Specialized.NameValueCollection querystring = HttpContext.Current.Request.QueryString;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("?").AppendFormat("pageindex=" + index);
foreach(string key in querystring.Keys)
{
if (key != "pageindex")
sb.AppendFormat("&{0}={1}", key, HttpContext.Current.Server.UrlEncode(querystring[key]));
}
return sb.ToString();
}
}

简单地把pageindex附加到当前url querystring即可.

分页内容输出

有了以上信息那构建一个分页内容输出就是件简单的事情了。

<div class="pagebar">
<ul> <li id="pageinfo"><a>@Html.Raw(pageindex + 1) / @pagecount</a></li>
@if (pageindex > 0)
{
<li><a href="@GetUrl(pageindex-1)">Previous</a> </li>
}
@{ spitindex = pageindex - 2;}
@if (spitindex > 4)
{ <li><a href="@GetUrl(0)">1</a> </li>
<li><a href="@GetUrl(spitindex - 2)">...</a> </li>
}
else
{
for (int i = 0; i < spitindex; i++)
{ <li><a href="@GetUrl(i)">@Html.Raw(i + 1)</a> </li> }
}
@for (int i = pageindex - 2; i < pageindex; i++)
{
if (i >= pageindex || i <)
{
continue;
} <li><a href="@GetUrl(i)">@Html.Raw(i+1)</a> </li> }
<li><a id="selectpage"><b>@Html.Raw(pageindex+1)</b> </a></li>
@for (int i = pageindex + 1; i < pagecount; i++)
{
if (i >= pageindex + 3)
{
break;
} <li><a href="@GetUrl(i)">@Html.Raw(i+1)</a> </li> }
@{ spitindex = pageindex + 3; }
@if (pagecount - 4 > spitindex)
{
<li><a href="@GetUrl(spitindex + 2)">...</a> </li>
<li><a href="@GetUrl(pagecount - 1)">@pagecount</a> </li>
}
else
{
for (int i = spitindex; i < pagecount; i++)
{ <li><a href="@GetUrl(i)">@Html.Raw(i+1)</a> </li>
}
}
@if (pageindex != pagecount - 1)
{ <li><a href="@GetUrl(pageindex + 1)">Next</a> </li> }
</ul>
</div>

使用控件

控件使用非常简单只需要在Razor通过RenderPage输出即可

@RenderPage("~/views/controls/pagebar.cshtml", new { pageindex = Model.PageIndex, pagecount = Model.PageCount })

控件效果

asp.net mvc简单实现基于Razor的分页控件的更多相关文章

  1. 自定义分页控件-基于Zhifeiya的分页控件改版

    基于Zhifeiya的分页控件改版的分页. html显示代码: <div class="pagelist"> {{.pagerHtml}} </div> c ...

  2. MVC无刷新查询,PagedList分页控件使用,导出Excel

    使用MVC开发也有一段时间了,总结下无刷新部分视图的使用.PagedList分页控件的使用. @using PagedList @model StaticPagedList<T> < ...

  3. ASP.NET MVC CheckBoxFor为什么会生成hidden input控件

    自己开发的公众号,可以领取淘宝内部优惠券 @Html.CheckBoxFor(m => m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input ch ...

  4. asp.net webform 自定义分页控件

    做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件. 翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册. 有图有真相,给个直观的认识: 自定义分页控件前台代码: & ...

  5. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  6. 在ASP.NET MVC中实现基于URL的权限控制

    本示例演示了在ASP.NET MVC中进行基于URL的权限控制,由于是基于URL进行控制的,所以只能精确到页.这种权限控制的优点是可以在已有的项目上改动极少的代码来增加权限控制功能,和项目本身的耦合度 ...

  7. ASP.NET MVC 简单介绍①

    ASP.NET  MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...

  8. ASP.NET MVC 简单事务添加

    ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...

  9. ASP.NET MVC 简单分页代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

随机推荐

  1. 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?

    2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm   据泰尔终端实验室公众微信 ...

  2. 【省选十连测之九】【DP】【组合计数去重】【欧拉函数】基本题

    目录 题意: 输入格式: 输出格式: 数据范围: 思路: 嵌套题的转移 基本题的转移 Part1 Part2 Part3 代码 题意: 这是一个关于括号组合的题. 首先定义一道题是由'(',')',' ...

  3. 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼

    目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...

  4. 使用POST下载文件

    一直以来,JS都没有比较好的可以直接处理二进制的方法.而Blob的存在,允许我们可以通过JS直接操作二进制数据.一.下载util.fetchDownload= function (opt,data) ...

  5. vue简单指令笔记

    v-once 执行一次性插值,数据改变插值处内容不会更新 <span v-once>这个将不会改变: {{ msg }}</span> v-text 插入文本 <!--两 ...

  6. [LeetCode] Minimum Cost to Merge Stones 混合石子的最小花费

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  7. JS 简单工厂模式,工厂模式(二)

    一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...

  8. 最基础的Eureka服务和注册搭建

    Eureka服务端 打开IDEA,新建项目 选择"next",写上组织名(Group)和项目名(Artifact) 选择如下选项,然后一直下一步,创建好项目. 删除不必要的文件 添 ...

  9. 判断以xx开头的字符串

    public static void main(String[] args) { String str = "EAN_13,1534651"; String strHttp = & ...

  10. JS基础整理面试题

    1.DOM和BOM的区别 DOM:document object model;文档对象模型,提供操作页面元素的方法和属性BOM:browser object model;浏览器对象模型,提供一些属性和 ...