Csharp: ASP.NET Core 3.1 Razor Pages - Query and Pagination

Microsoft.EntityFrameworkCore.SqlServer SqlServer 2012及以上 https://github.com/dotnet/efcore
Microsoft.EntityFrameworkCore.Sqlite Sqlite 3.7及以上 https://github.com/dotnet/efcore
Microsoft.EntityFrameworkCore.InMemory EF Core内存中的数据库 https://github.com/dotnet/efcore
Microsoft.EntityFrameworkCore.Cosmos Azure Cosmos DB SQL API https://github.com/dotnet/efcore
Npgsql.EntityFrameworkCore.PostgreSQL PostgreSQL https://github.com/npgsql/efcore.pg
Pomelo.EntityFrameworkCore.MySql MySql,MariaDB https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql
Pomelo.EntityFrameworkCore.MyCat MyCat服务器 https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MyCat
EntityFrameworkCore.SqlServerCompact40 https://github.com/ErikEJ/EntityFramework.SqlServerCompact
EntityFrameworkCore.SqlServerCompact35 https://github.com/ErikEJ/EntityFramework.SqlServerCompact
FirebirdSql.EntityFrameworkCore.Firebird FirebirdSQL 2.5及3.X https://github.com/FirebirdSQL/NETProvider
EntityFrameworkCore.FirebirdSQL FirebirdSQL 2.5及3.X https://github.com/ralmsdeveloper/EntityFrameworkCore.FirebirdSQL
MySql.Data.EntityFrameworkCore MySql
Oracle.EntityFrameworkCore Oracle DB 11.2 及更高版本
IBM.EntityFrameworkCore DB2,Informix
IBM.EntityFrameworkCore-lnx DB2,Informix
IBM.EntityFrameworkCore-osx DB2,Informix
EntityFrameworkCore.Jet Microsoft Access https://github.com/bubibubi/EntityFrameworkCore.Jet
EntityFrameworkCore.OpenEdge Progress OpenEdge https://github.com/alexwiese/EntityFrameworkCore.OpenEdge
Devart.Data.Oracle.EFCore Oracle DB 9.0及更高版本
Devart.Data.PostgreSql.EFCore PostgreSql 8.0及以上版本
Devart.Data.SQLite.EFCore SQLite 3及以上版本
Devart.Data.MySql.EFCore MySql 5及以上版本
FileContextCore 在文件中存储数据 https://github.com/pmizel/DevMentor.Context.FileContext

 

 

libman.json:

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
{
  "version": "1.0", //当前的libman文件版本
  "defaultProvider": "cdnjs", //默认从哪个CDN网络下载文件
  "libraries": [
    {
      "library": "twitter-bootstrap@4.3.1", //要下载的前端包名称
      "destination": "wwwroot/lib/twitter-bootstrap/" //存放库的文件路径地址
    },
    {
      "library": "jquery@3.4.1", //要下载的前端包名称
      "destination": "wwwroot/lib/jquery/", //存放库的文件路径地址
      "provider": "jsdelivr", //针对某个独立的文件,从其他源下载。
      "files": [ "dist/jquery.js", "dist/jquery.min.js" ] //下载该库中特定的文件,而不是下载所有的文件
 
    },
    {
      "library": "jquery-validate@1.19.1",
      "destination": "wwwroot/lib/jquery-validate"
    },
    {
      "library": "jquery-validation-unobtrusive@3.2.11",
      "destination": "wwwroot/lib/jquery-validate-unobtrusive"
    },
    {
      "provider": "jsdelivr",
      "library": "font-awesome@4.7.0",
      "destination": "wwwroot/lib/font-awesome"
    }
  ]
}

  

Startup.cs

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
 
namespace RazorPagesPagination
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
 
        public IConfiguration Configuration { get; }
 
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSession();
            services.AddMvc();
        }
 
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //wwwroot 下的文件夹配置
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
 
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSession();
            app.UseMvc();
        }
    }
}

  

_Layout.cshtml

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
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ASP.NET Core Razor Pages - Pagination Example</title>
    <meta name="description" content=" geovindu,Geovin Du,涂聚文" />
    <meta name="keywords" content="geovindu,Geovin Du" />
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />
 
    <link href="~/lib/twitter-bootstrap/css/bootstrap.css" rel="stylesheet" />
 
 
</head>
<body>
    <div class="container text-center">
        <div class="col">
            <h1>ASP.NET Core Razor Pages - Pagination Example</h1>
            @RenderBody()
        </div>
    </div>
    <hr />
    <div class="credits text-center">
        <p>
            <a href="http://jasonwatmore.com/post/2018/10/15/aspnet-core-razor-pages-pagination-example">ASP.NET Core Razor Pages - Pagination Example</a>
        </p>
        <p>
            <a href="http://jasonwatmore.com">JasonWatmore.com</a>
        </p>
    </div>
 
 
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/twitter-bootstrap/js/bootstrap.min.js"></script>
 
    @RenderSection("Scripts", required: false)
</body>
</html>

  

Index.cshtml

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
78
79
80
81
82
@page
@model RazorPagesPagination.Pages.IndexModel
<!-- pager parameter controls -->
<form method="post" class="container border text-left pt-2 mb-3">
    <div class="form-row form-group">
        <div class="col">
            <label asp-for="TotalItems">Total number of items</label>
            <select asp-for="TotalItems" asp-items="Model.TotalItemsList" class="form-control form-control-sm" onchange="this.form.submit()"></select>
        </div>
        <div class="col">
            <label asp-for="PageSize">Items per page</label>
            <select asp-for="PageSize" asp-items="Model.PageSizeList" class="form-control form-control-sm" onchange="this.form.submit()"></select>
        </div>
        <div class="col">
            <label asp-for="MaxPages">Max page links displayed</label>
            <select asp-for="MaxPages" asp-items="Model.MaxPagesList" class="form-control form-control-sm" onchange="this.form.submit()"></select>
        </div>
 
        标题: <input type="text" asp-for="SearchKey" value="@Model.SearchKey" onchange="this.form.submit()" />
        <input type="submit" value="查询" onchange="this.form.submit()" />
    </div>
</form>
 
<!-- items being paged -->
<table class="table table-sm table-striped table-bordered">
    @if (!Object.Equals(Model.DuItmes, null))
    {
        @foreach (var item in Model.DuItmes)
        {
            <tr>
                <td>@item.Id</td>
                <td>@item.RealName</td>
                <td>@item.UserName</td>
            </tr>
        }
    }
    else
    {
        <tr>
            <td>No data!</td>
        </tr>
 
    }
</table>
 
<!-- pager -->
@if (!Object.Equals(Model.DuItmes, null))
{
    @if (Model.Pager.Pages.Any())
    {
        <nav class="table-responsive">
            <ul class="pagination justify-content-center d-flex flex-wrap">
                @if (Model.Pager.CurrentPage > 1)
                {
                    <li class="page-item">
                        <a class="page-link" href="/">First</a>
                    </li>
                    <li class="page-item">
                        <a class="page-link" href="/?p=@(Model.Pager.CurrentPage - 1)">Previous</a>
                    </li>
                }
 
                @foreach (var p in Model.Pager.Pages)
                {
                    <li class="page-item @(p == Model.Pager.CurrentPage ? "active" : "")">
                        <a class="page-link" href="/?p=@p">@p</a>
                    </li>
                }
 
                @if (Model.Pager.CurrentPage < Model.Pager.TotalPages)
                {
                    <li class="page-item">
                        <a class="page-link" href="/?p=@(Model.Pager.CurrentPage + 1)">Next</a>
                    </li>
                    <li class="page-item">
                        <a class="page-link" href="/?p=@(Model.Pager.TotalPages)">Last</a>
                    </li>
                }
            </ul>
        </nav>
    }
}

  

Index.cshtml.cs

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using JW; //JW.Pager
 
//https://github.com/cornflourblue/JW.Pager
//
 
namespace RazorPagesPagination.Pages
{
 
    /// <summary>
    /// geovindu,Geovin Du,涂聚文
    /// </summary>
    public class IndexModel : PageModel
    {
        public IEnumerable<string> Items { get; set; }
 
        public List<Person> DuItmes { get; set; }
 
        public List<Person> dummyItems { get; set; }
        public Pager Pager { get; set; }
        public SelectList TotalItemsList { get; set; }
        public int TotalItems { get; set; }
        public SelectList PageSizeList { get; set; }
        public int PageSize { get; set; }
        public SelectList MaxPagesList { get; set; }
        public int MaxPages { get; set; }
 
        [BindProperty(SupportsGet = true)]
        public string SearchKey { get; set; }
 
        public void OnGet(int p = 1)
        {
            // properties for pager parameter controls
            TotalItemsList = new SelectList(new []{ 10, 150, 500, 1000, 5000, 10000, 50000, 100000, 1000000 });
            TotalItems = HttpContext.Session.GetInt32("TotalItems") ?? 150;
            PageSizeList = new SelectList(new []{ 1, 5, 10, 20, 50, 100, 200, 500, 1000 });
            PageSize = HttpContext.Session.GetInt32("PageSize") ?? 10;
            MaxPagesList = new SelectList(new []{ 1, 5, 10, 20, 50, 100, 200, 500 });
            MaxPages = HttpContext.Session.GetInt32("MaxPages") ?? 10;
            SearchKey = HttpContext.Session.GetString("SearchKey" ?? "");
            // generate list of sample items to be paged
 
            //查询一遍是空值
            var dummyItems = Person.GetAllPerson().AsQueryable();// var dummyItems =Enumerable.Range(1, TotalItems).Select(x => "Item " + x);
            if(object.Equals(dummyItems,null))
            {
               var dummyItemdd = Person.GetAllPerson();
                dummyItems = dummyItemdd.AsQueryable();
            }
            if (!string.IsNullOrEmpty(SearchKey))
            {
                dummyItems = dummyItems.Where(b => b.RealName.Contains(SearchKey)|| b.UserName.Contains(SearchKey));
                if (dummyItems.Count() > 0)
                {
                    Pager = new Pager(dummyItems.Count(), p, PageSize, MaxPages);
 
                    // assign the current page of items to the Items property  DuItmes
                    //Items = dummyItems.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize);
                    DuItmes = dummyItems.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToList();
                }
            }
            else
            {
                // get pagination info for the current page
                Pager = new Pager(dummyItems.Count(), p, PageSize, MaxPages);
 
                // assign the current page of items to the Items property
                //Items = dummyItems.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize);
                DuItmes = dummyItems.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToList();
            }
        }
 
        public IActionResult OnPost(int totalItems, int pageSize, int maxPages)
        {
            // update pager parameters for session and redirect back to 'OnGet'
            HttpContext.Session.SetInt32("TotalItems", totalItems);
            HttpContext.Session.SetInt32("PageSize", pageSize);
            HttpContext.Session.SetInt32("MaxPages", maxPages);
            HttpContext.Session.SetString("SearchKey", SearchKey);
            return Redirect("/");
        }
    }
 
 
    public class Person
    {
        /// <summary>
        ///
        /// </summary>
        public int Id { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string RealName { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string UserName { get; set; }
 
 
        public static List<Person> GetAllPerson()
        {
            List<Person> listPerson = new List<Person>
            {
                new Person{Id=1,RealName="涂聚文",UserName="geovindu1" },
                new Person{Id=2,RealName="涂聚文",UserName="geovindu2" },
                new Person{Id=3,RealName="涂聚文",UserName="geovindu3" },
                new Person{Id=4,RealName="涂聚文",UserName="geovindu4" },
                new Person{Id=5,RealName="涂聚文",UserName="geovindu5" },
                new Person{Id=6,RealName="涂聚文",UserName="geovindu6" },
                new Person{Id=7,RealName="涂聚文",UserName="geovindu7" },
                new Person{Id=8,RealName="涂聚文",UserName="geovindu8" },
                new Person{Id=9,RealName="涂聚文",UserName="geovindu9" },
                new Person{Id=10,RealName="涂聚文",UserName="geovindu10" },
                new Person{Id=11,RealName="涂聚文",UserName="geovindu11" },
                new Person{Id=12,RealName="涂聚文",UserName="geovindu12" },
                new Person{Id=13,RealName="涂聚文",UserName="geovindu13" },
                new Person{Id=14,RealName="涂聚文",UserName="geovindu14" },
                new Person{Id=15,RealName="涂聚文",UserName="geovindu15" },
                new Person{Id=16,RealName="涂聚文",UserName="geovindu16" },
                new Person{Id=17,RealName="涂聚文",UserName="geovindu17" },
                new Person{Id=18,RealName="涂聚文",UserName="geovindu18" },
                new Person{Id=19,RealName="涂聚文",UserName="geovindu19" },
                new Person{Id=20,RealName="涂聚文",UserName="geovindu20" },
                new Person{Id=21,RealName="涂聚文",UserName="geovindu21" },
                new Person{Id=22,RealName="涂聚文",UserName="geovindu22" },
                new Person{Id=23,RealName="涂聚文",UserName="geovindu23" },
                new Person{Id=24,RealName="涂聚文",UserName="geovindu24" },
                new Person{Id=25,RealName="涂聚文",UserName="geovindu25" },
                new Person{Id=26,RealName="涂聚文",UserName="geovindu26" },
                new Person{Id=27,RealName="涂聚文",UserName="geovindu27" },
                new Person{Id=28,RealName="涂聚文",UserName="geovindu28" },
                new Person{Id=29,RealName="涂聚文",UserName="geovindu29" },
                new Person{Id=30,RealName="涂聚文",UserName="geovindu30" },
            };
 
            return listPerson;
        }
    }
}

  

 

 

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace JW
{
    //JW.Pager
    //https://github.com/cornflourblue/JW.Pager/blob/master/Pager.cs
    public class Pager
    {
        public Pager(
            int totalItems,
            int currentPage = 1,
            int pageSize = 10,
            int maxPages = 10)
        {
            // calculate total pages
            var totalPages = (int)Math.Ceiling((decimal)totalItems / (decimal)pageSize);
 
            // ensure current page isn't out of range
            if (currentPage < 1)
            {
                currentPage = 1;
            }
            else if (currentPage > totalPages)
            {
                currentPage = totalPages;
            }
 
            int startPage, endPage;
            if (totalPages <= maxPages)
            {
                // total pages less than max so show all pages
                startPage = 1;
                endPage = totalPages;
            }
            else
            {
                // total pages more than max so calculate start and end pages
                var maxPagesBeforeCurrentPage = (int)Math.Floor((decimal)maxPages / (decimal)2);
                var maxPagesAfterCurrentPage = (int)Math.Ceiling((decimal)maxPages / (decimal)2) - 1;
                if (currentPage <= maxPagesBeforeCurrentPage)
                {
                    // current page near the start
                    startPage = 1;
                    endPage = maxPages;
                }
                else if (currentPage + maxPagesAfterCurrentPage >= totalPages)
                {
                    // current page near the end
                    startPage = totalPages - maxPages + 1;
                    endPage = totalPages;
                }
                else
                {
                    // current page somewhere in the middle
                    startPage = currentPage - maxPagesBeforeCurrentPage;
                    endPage = currentPage + maxPagesAfterCurrentPage;
                }
            }
 
            // calculate start and end item indexes
            var startIndex = (currentPage - 1) * pageSize;
            var endIndex = Math.Min(startIndex + pageSize - 1, totalItems - 1);
 
            // create an array of pages that can be looped over
            var pages = Enumerable.Range(startPage, (endPage + 1) - startPage);
 
            // update object instance with all pager properties required by the view
            TotalItems = totalItems;
            CurrentPage = currentPage;
            PageSize = pageSize;
            TotalPages = totalPages;
            StartPage = startPage;
            EndPage = endPage;
            StartIndex = startIndex;
            EndIndex = endIndex;
            Pages = pages;
        }
 
        public int TotalItems { get; private set; }
        public int CurrentPage { get; private set; }
        public int PageSize { get; private set; }
        public int TotalPages { get; private set; }
        public int StartPage { get; private set; }
        public int EndPage { get; private set; }
        public int StartIndex { get; private set; }
        public int EndIndex { get; private set; }
        public IEnumerable<int> Pages { get; private set; }
    }
}

  

 

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
@page
@model RazorPagesBook.IndexModel
 
@{
    ViewData["Title"] = "Index";
}
 
<h1>Index</h1>
 
<p>
    <a asp-page="Create">Create New</a>
</p>
<form method="post" class="container border text-left pt-2 mb-3">
    <div class="form-row form-group">
        <div class="col">
            <label asp-for="TotalItems">Total number of items</label>
            <select asp-for="TotalItems" asp-items="Model.TotalItemsList" class="form-control form-control-sm" onchange="this.form.submit()"></select>
        </div>
        <div class="col">
            <label asp-for="PageSize">Items per page</label>
            <select asp-for="PageSize" asp-items="Model.PageSizeList" class="form-control form-control-sm" onchange="this.form.submit()"></select>
        </div>
        <div class="col">
            <label asp-for="MaxPages">Max page links displayed</label>
            <select asp-for="MaxPages" asp-items="Model.MaxPagesList" class="form-control form-control-sm" onchange="this.form.submit()"></select>
        </div>
    </div>
    <p>
        标题: <input type="text" asp-for="SearchKey" value="@Model.SearchKey" />
        <input type="submit" value="查询" />
    </p>
</form>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Book[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Book[0].PublicationDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Book[0].Author)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Book[0].Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Book[0].Type)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @if (Object.Equals(Model.Book, null))
        {
            @foreach (var item in Model.Book)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.PublicationDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Author)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Type)
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ID">编辑</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">详情</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">删除</a>
                    </td>
                </tr>
            }
        }
        else
        {
            <tr>
                <td>没有查询到数据</td>
            </tr>
 
         }
        </tbody>
</table>
<!-- pager -->
@if (Object.Equals(Model.Book, null))
{
    @if (Model.Pager.Pages.Any())
    {
        <nav class="table-responsive">
            <ul class="pagination justify-content-center d-flex flex-wrap">
                @if (Model.Pager.CurrentPage > 1)
                {
                    <li class="page-item">
                        <a class="page-link" href="/Books/">First</a>
                    </li>
                    <li class="page-item">
                        <a class="page-link" href="/Books/?p=@(Model.Pager.CurrentPage - 1)">Previous</a>
                    </li>
                }
 
                @foreach (var p in Model.Pager.Pages)
                {
                    <li class="page-item @(p == Model.Pager.CurrentPage ? "active" : "")">
                        <a class="page-link" href="/Books/?p=@p">@p</a>
                    </li>
                }
 
                @if (Model.Pager.CurrentPage < Model.Pager.TotalPages)
                {
                    <li class="page-item">
                        <a class="page-link" href="/Books/?p=@(Model.Pager.CurrentPage + 1)">Next</a>
                    </li>
                    <li class="page-item">
                        <a class="page-link" href="/Books/?p=@(Model.Pager.TotalPages)">Last</a>
                    </li>
                }
            </ul>
        </nav>
    }
}

  

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using RazorPagesBook.Data;
using RazorPagesBook.Models;
 
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Http;
 
 
 
 
namespace RazorPagesBook
{
 
 
    /// <summary>
    /// geovindu,Geovin Du,涂聚文
    /// </summary>
    public class IndexModel : PageModel
    {
        private readonly RazorPagesBook.Data.RazorPagesBookContext _context;
 
       // public IEnumerable<string> Items { get; set; }
        public DuPager Pager { get; set; }
        public SelectList TotalItemsList { get; set; }
        public int TotalItems { get; set; }
        public SelectList PageSizeList { get; set; }
        public int PageSize { get; set; }
        public SelectList MaxPagesList { get; set; }
        public int MaxPages { get; set; }
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        public IndexModel(RazorPagesBook.Data.RazorPagesBookContext context)
        {
            _context = context;
        }
        /// <summary>
        /// 查询的关键字
        /// geovindu, Geovin Du, 涂聚文
        /// 塗聚文,天下为公
        /// </summary>
        [BindProperty(SupportsGet = true)]
        public string SearchKey { get; set; }
 
        public IList<Book> Book { get;set; }
 
        //public async Task OnGetAsync()
        //{
        //    TotalItemsList = new SelectList(new[] { 10, 150, 500, 1000, 5000, 10000, 50000, 100000, 1000000 });
        //    TotalItems = HttpContext.Session.GetInt32("TotalItems") ?? 150;
        //    PageSizeList = new SelectList(new[] { 1, 5, 10, 20, 50, 100, 200, 500, 1000 });
        //    PageSize = HttpContext.Session.GetInt32("PageSize") ?? 10;
        //    MaxPagesList = new SelectList(new[] { 1, 5, 10, 20, 50, 100, 200, 500 });
        //    MaxPages = HttpContext.Session.GetInt32("MaxPages") ?? 10;
 
 
        //    var books = _context.Book.AsQueryable();
        //    //var books = from b in _context.Book select b;
        //    if (!string.IsNullOrEmpty(SearchKey))
        //    {
        //        books = books.Where(b => b.Title.Contains(SearchKey));
        //        Pager = new DuPager(books.Count(), Pager.CurrentPage, PageSize, MaxPages);
        //        Book = await books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToListAsync();
 
 
        //    }
        //    else
        //    {
        //        //var page = parents.SelectMany(p => p.Children).Skip(PageIndex * PageSize).Take(PageSize);
        //        Pager = new DuPager(books.Count(), Pager.CurrentPage, PageSize, MaxPages);
        //        Book = await books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToListAsync();
        //        // Book = await books.ToListAsync();
        //    }
        //}
        /// <summary>
        ///
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        //public async Task OnGetAsync(int p = 1)
        //{
        //    TotalItemsList = new SelectList(new[] { 10, 150, 500, 1000, 5000, 10000, 50000, 100000, 1000000 });
        //    TotalItems = HttpContext.Session.GetInt32("TotalItems") ?? 150;
        //    PageSizeList = new SelectList(new[] { 1, 5, 10, 20, 50, 100, 200, 500, 1000 });
        //    PageSize = HttpContext.Session.GetInt32("PageSize") ?? 10;
        //    MaxPagesList = new SelectList(new[] { 1, 5, 10, 20, 50, 100, 200, 500 });
        //    MaxPages = HttpContext.Session.GetInt32("MaxPages") ?? 10;
 
 
        //    var books = _context.Book.AsQueryable();
        //    //var books = from b in _context.Book select b;
        //    if (!string.IsNullOrEmpty(SearchKey))
        //    {
        //        books = books.Where(b => b.Title.Contains(SearchKey));
        //        Pager = new DuPager(books.Count(), p, PageSize, MaxPages);
        //        Book = await books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToListAsync();
        //    }
        //    else
        //    {
        //        //var page = parents.SelectMany(p => p.Children).Skip(PageIndex * PageSize).Take(PageSize);
        //        Pager = new DuPager(books.Count(), p, PageSize, MaxPages);
        //        // Book = await books.ToListAsync();
        //        Book = await books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToListAsync();
        //    }
 
        //}
 
 
        public void OnGet(int p = 1)
        {
            // properties for pager parameter controls
            TotalItemsList = new SelectList(new[] { 10, 150, 500, 1000, 5000, 10000, 50000, 100000, 1000000 });
            TotalItems = HttpContext.Session.GetInt32("TotalItems") ?? 150;
            PageSizeList = new SelectList(new[] { 1, 5, 10, 20, 50, 100, 200, 500, 1000 });
            PageSize = HttpContext.Session.GetInt32("PageSize") ?? 10;
            MaxPagesList = new SelectList(new[] { 1, 5, 10, 20, 50, 100, 200, 500 });
            MaxPages = HttpContext.Session.GetInt32("MaxPages") ?? 10;
            SearchKey=HttpContext.Session.GetString("SearchKey"??"");
            // generate list of sample items to be paged
            var books = _context.Book.AsQueryable(); //Enumerable.Range(1, TotalItems).Select(x => "Item " + x);
 
            // get pagination info for the current page
            if (!string.IsNullOrEmpty(SearchKey))
            {
                books = books.Where(b => b.Title.Contains(SearchKey)||b.Author.Contains(SearchKey));
                if (books.Count() > 0)
                {
                    Pager = new DuPager(books.Count(), p, PageSize, MaxPages);
                    Book = books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToList();
                }
            }
            else
            {
 
                Pager = new DuPager(books.Count(), p, PageSize, MaxPages);
                // assign the current page of items to the Items property
                // Book = books.SelectMany(p=>p.Title).Skip(Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize);
                // var results = books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize);
 
                Book = books.Skip((Pager.CurrentPage - 1) * Pager.PageSize).Take(Pager.PageSize).ToList();// books.ToList();
            }
                 
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="totalItems"></param>
        /// <param name="pageSize"></param>
        /// <param name="maxPages"></param>
        /// <returns></returns>
        public IActionResult OnPost(int totalItems, int pageSize, int maxPages)
        {
            // update pager parameters for session and redirect back to 'OnGet'
            HttpContext.Session.SetInt32("TotalItems", totalItems);
            HttpContext.Session.SetInt32("PageSize", pageSize);
            HttpContext.Session.SetInt32("MaxPages", maxPages);
            HttpContext.Session.SetString("SearchKey", SearchKey);
            //查询返回页面
            return Redirect("/Books/");
        }
    }
}

  

 

 

posted @   ®Geovin Du Dream Park™  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
历史上的今天:
2015-04-20 csharp: Gets a files formatted size.
2013-04-20 SVG In HTML5 Pages
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示