动态创建分页

C#
本文总阅读量:
  1. 1. 接着上一个demo
  2. 2. 创建page页的model
  3. 3. 编写page action 分一下步骤
  4. 4. 创建page navigation

接着上一个demo

现在controller中创建一个新的action

先添加两个私有字段分别表示每页条数,和整个一组多少个,为了方便演示,设置小点

1
2
private int PageSize = 3;
private int PageGroupSize = 2;

创建page页的model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class PagingInfo
{
public int CurrentPage { get; set; }
public int PageSize { get; set; }
public int TotalItems { get; set; }

public int CurrentDividePage
{
get
{
if (CurrentPage % PageGroupSize == 0)
return (int)CurrentPage / PageGroupSize;
return (int)CurrentPage / PageGroupSize + 1;
}
}

public int TotalDividePages
{
get
{
return (int)Math.Ceiling((decimal)TotalItems / PageSize / PageGroupSize);
}
}

public int TotalPages
{
get
{
return (int)Math.Ceiling((decimal)TotalItems / PageSize);
}
}

public int PageGroupSize { get; set; }//底端呈现多少页
public bool HasPre
{
get { return CurrentDividePage == 1 ? false : true; }
}

public bool HasNext
{
get { return CurrentDividePage == TotalDividePages ? false : true; }
}
}

编写page action 分一下步骤

  1. 想取得对应页的list
1
2
3
4
var products = productService.Products
.OrderBy(m => m.ProductID)
.Skip((page - 1) * PageSize)
.Take(PageSize);
  1. 创建对应的pageinfo
1
2
3
4
5
6
7
var pageinfo = new PagingInfo()
{
CurrentPage = page,
PageSize = this.PageSize,
TotalItems = productService.Products.Count(),
PageGroupSize = PageGroupSize
};
  1. 此时需要创建创建对应的page页view model

    添加实体中的项目方便model操作

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ProductViewModel
{
[DisplayName("编号")]
public int ProductID { get; set; }
[DisplayName("商品名")]
public string Name { get; set; }
[DisplayName("描述")]
public string Description { get; set; }
[DisplayName("价格")]
public decimal Price { get; set; }
public IEnumerable<Product> Products { get; set; }
public PagingInfo PageInfo { get; set; }
}
  1. 创建view对象,返回view(model)完成action
1
2
3
4
5
6
7
var model=new ProductViewModel()
{
Products = products,
PageInfo = pageinfo
};

return View(model);
  1. 创建对应的视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<table class="striped responsive-table">
<tr>
<th>
@Html.DisplayNameFor(model => model.ProductID)
</th>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Description)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
</tr>

@foreach (var item in Model.Products)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ProductID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
</tr>
}

</table>

创建page navigation

创建pagehelper用来动态创建page navigation ,委托用来传pageindex对应的url,可以用方法代替

1
2
3
4
5
6
7
public static class PageHelper
{
public static MvcHtmlString PageLink(this HtmlHelper htmlHelper, PagingInfo pageinfo,Func<int, string> pageUrl)
{

}
}

先创建一个为htmlhelper拓展方法的静态方法,方便在razor视图里面操作

此时创建的会根据你使用的界面有所不同

  1. 先根据传入的pageinfo.CurrentPage
  2. 方法中主要是对尾页跟每个页组最后一位进行特殊处理,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
public static MvcHtmlString PageLink(this HtmlHelper htmlHelper, PagingInfo pageinfo, Func<int, string> pageUrl)
{
StringBuilder sb = new StringBuilder();
int length;
if (pageinfo.TotalPages < pageinfo.PageGroupSize)
length = pageinfo.TotalPages;
else if (pageinfo.CurrentDividePage == pageinfo.TotalDividePages)
{
length = pageinfo.TotalPages - (pageinfo.CurrentDividePage - 1) * pageinfo.PageGroupSize;
}
else
length = pageinfo.PageGroupSize;

TagBuilder ul = new TagBuilder("ul");
ul.MergeAttribute("class", "pagination");

var pre = new TagBuilder("li");
var pre_a = new TagBuilder("a");
var i_pre = new TagBuilder("i");
i_pre.MergeAttribute("class", "material-icons");
i_pre.SetInnerText("chevron_left");
pre_a.InnerHtml = i_pre.ToString();
if (!pageinfo.HasPre)
pre.MergeAttribute("class", "disabled");
else
pre_a.MergeAttribute("href", pageUrl((pageinfo.CurrentDividePage - 2) * pageinfo.PageGroupSize + 1));
pre.InnerHtml = pre_a.ToString();
sb.Append(pre.ToString());

for (int i = 1; i <= length; i++)
{
TagBuilder liTag = new TagBuilder("li");

TagBuilder tag = new TagBuilder("a");

if (pageinfo.CurrentPage % pageinfo.PageGroupSize != i)
{

if (pageinfo.CurrentPage % pageinfo.PageGroupSize == 0 && i == length)
{
liTag.MergeAttribute("class", "active");
}
else
{
liTag.MergeAttribute("class", "waves-effect");
tag.MergeAttribute("href",
pageUrl((pageinfo.CurrentDividePage - 1) * pageinfo.PageGroupSize + i));
}
}
else
{
liTag.MergeAttribute("class", "active");
}

tag.SetInnerText(i.ToString());

liTag.InnerHtml = tag.ToString();

sb.Append(liTag.ToString());
}

var next = new TagBuilder("li");
var next_i = new TagBuilder("i");
next_i.MergeAttribute("class", "material-icons");
next_i.SetInnerText("chevron_right");
var next_a = new TagBuilder("a");
next_a.InnerHtml = next_i.ToString();
if (!pageinfo.HasNext)
next.MergeAttribute("class", "disabled");
else
next_a.MergeAttribute("href", pageUrl(pageinfo.CurrentDividePage * pageinfo.PageGroupSize + 1));
next.InnerHtml = next_a.ToString();
sb.Append(next.ToString());

ul.InnerHtml = sb.ToString();
return MvcHtmlString.Create(ul.ToString());
}
  1. view文件夹下面web.config添加配置
1
2
3
4
5
6
7
8
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="luox78.GraduationProject.WebDemo.Helper" />
</namespaces>
</pages>
</system.web.webPages.razor>
  1. view页面添加,生成块

    1
    @Html.PageLink(Model.PageInfo,m=>Url.Action("Page","Product",new { page = m }))