asp.net MVC分页代码分享

关于“ASP.NET MVC分页代码分享”的攻略,我将从以下几个方面进行详细讲解:

  1. MVC分页原理简介
  2. 分页代码实现过程
  3. 示例说明

1. MVC分页原理简介

分页的目的是为了减少在一次性返回过多结果的情况下对服务器和数据库的压力,同时让用户更加方便的获取所需要的数据。MVC分页主要分为两个部分,分别是分页查询和分页显示。分页查询主要是通过参数指定需要返回的数据页数来获取数据,分页显示则是将获取到的分页数据以指定的方式进行展示。

2. 分页代码实现过程

以下是实现一个基于ASP.NET MVC的分页功能的代码过程

定义分页参数

通过ViewModel传递分页参数,这里我们定义一个PageViewModel用于传递分页信息:

public class PageViewModel
{
    public int CurrentPage { get; set; }  // 当前页码
    public int TotalPages { get; set; }   // 总页数
    public int PageSize { get; set; }     // 每页数据量
    public bool HasPreviousPage => (CurrentPage > 1);         // 是否有上一页
    public bool HasNextPage => (CurrentPage < TotalPages);    // 是否有下一页
}

数据分页查询

在查询数据时,我们需要通过传递的分页参数来获取特定的数据集合,这里以EF中的Query方法为例:

public IQueryable<Product> GetProducts(int pageNumber, int pageSize)
{
    return context.Products.OrderBy(p => p.Name)
                            .Skip((pageNumber - 1) * pageSize)
                            .Take(pageSize)
                            .AsNoTracking();
}

在这里,我们通过Skip和Take方法来对数据进行分页查询,并可以设置排序方式。

分页数计算

针对所查询到的总数据量,需要进行分页计算,设定每页数据量的同时,还需要获取总页数,计算方式如下:

var count = context.Products.Count();
var totalPages = (int)Math.Ceiling(count / (double)pageSize);

分页显示

最后,我们将获取到的分页数据以指定的方式进行展示,这里以Razor视图模板为例,使用@foreach循环显示查询到的数据:

@foreach (var product in Model.Products)
{
    <tr>
        <td>@product.Name</td>
        <td>@product.Category</td>
        <td>@product.Price</td>
    </tr>
}

分页链接生成

在列表底部我们需要展示分页链接,可以使用HtmlHelper扩展方法来实现:

@Html.PageLinks(Model.PageInfo, x => Url.Action("List",
            new { pageNumber = x, category = Model.CurrentCategory }))

一个完整的分页视图代码如下:

@model ProductsListViewModel

@if (Model.Products.Any())
{
    <table class="table">
        <thead>
            <tr>
                <th>名称</th>
                <th>分类</th>
                <th>价格</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var product in Model.Products)
            {
                <tr>
                    <td>@product.Name</td>
                    <td>@product.Category</td>
                    <td>@product.Price</td>
                </tr>
            }
        </tbody>
    </table>

    @Html.PageLinks(Model.PageInfo, x => Url.Action("List",
            new { pageNumber = x, category = Model.CurrentCategory }))
}
else
{
    <p>暂无数据!</p>
}

分页链接生成代码实现

下面是利用HtmlHelper扩展方法生成分页链接的代码实现:

public static class PagingHelpers
{
    public static MvcHtmlString PageLinks(this HtmlHelper html,
                                PageViewModel pageInfo,
                                Func<int, string> pageUrl)
    {
        var result = new StringBuilder();
        var ulTag = new TagBuilder("ul");
        ulTag.AddCssClass("pagination");

        //生成上一页
        var previous = new TagBuilder("li");
        previous.InnerHtml = (pageInfo.HasPreviousPage) ?
            $"<a href=\"{pageUrl(pageInfo.CurrentPage - 1)}\">上一页</a>" :
            "<span class=\"disabled\">上一页</span>";
        previous.AddCssClass("page-item");
        result.Append(previous.ToString());

        //生成页码
        for (int i = 1; i <= pageInfo.TotalPages; i++)
        {
            var liTag = new TagBuilder("li");
            liTag.AddCssClass("page-item");

            var aTag = new TagBuilder("a");
            aTag.AddCssClass("page-link");
            aTag.InnerHtml = i.ToString();

            if (i == pageInfo.CurrentPage)
            {
                liTag.AddCssClass("active");
                aTag.AddCssClass("text-white");
            }
            else
            {
                aTag.Attributes["href"] = pageUrl(i);
            }

            liTag.InnerHtml = aTag.ToString();

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

        //生成下一页
        var next = new TagBuilder("li");
        next.InnerHtml = (pageInfo.HasNextPage) ?
            $"<a href=\"{pageUrl(pageInfo.CurrentPage + 1)}\">下一页</a>" :
            "<span class=\"disabled\">下一页</span>";
        next.AddCssClass("page-item");
        result.Append(next.ToString());

        ulTag.InnerHtml = result.ToString();

        return MvcHtmlString.Create(ulTag.ToString());
    }
}

3. 示例说明

以下是两个使用ASP.NET MVC进行分页的示例:

示例1:分页查询投资署数据

假设我们已经连接到数据库,数据表中存储了投资署的所有机构和企业,我们需要在搜索栏中输入机构或企业名称,点击搜索按钮后,页面将自动跳转到第一页所查询出的数据列表,如果查询到的数据集合总量超过20,那么我们可以设置页面底部的分页链接来方便用户查看到更多数据。

以下是部分代码实现过程:

public class InvestOrgController : Controller
{
    public int PageSize = 20; //每页数据量

    private IDatabaseRepository _repository;
    public InvestOrgController(IDatabaseRepository repository)
    {
        _repository = repository;
    }

    public ViewResult List(string query, int page = 1)
    {
        var model = new InvestOrgListViewModel
        {
            Orgs = _repository.InvestOrgs
                    .Where(p => String.IsNullOrEmpty(query) || p.OrgName.Contains(query))
                    .OrderBy(p => p.OrgName)
                    .Skip((page - 1) * PageSize)
                    .Take(PageSize),
            PageInfo = new PageViewModel
            {
                CurrentPage = page,
                PageSize = PageSize,
                TotalItems = _repository.InvestOrgs
                    .Count(p => String.IsNullOrEmpty(query) || p.OrgName.Contains(query))
            },
            Query = query
        };
        return View(model);
    }
}

以下是部分视图代码:

@model InvestOrgListViewModel
<div class="query-form">
    @using (Html.BeginForm("List", "InvestOrg", FormMethod.Get))
    {
        <div class="row">
            <div class="col-md-9">
                @Html.TextBox("query", Model.Query, new { @class = "form-control" })
            </div>
            <div class="col-md-3">
                <button class="btn btn-primary" type="submit">搜索</button>
            </div>
        </div>
    }
</div>
@if (Model.Orgs.Any())
{
    <table class="table">
        <thead>
            <tr>
                <th>机构名称</th>
                <th>管制项目</th>
                <th>评估结果</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var org in Model.Orgs)
            {
                <tr>
                    <td>@org.OrgName</td>
                    <td>@org.RestrictedProject</td>
                    <td>@org.Result</td>
                </tr>
            }
        </tbody>
    </table>

    @Html.PageLinks(Model.PageInfo, x => Url.Action("List",
            new { page = x, query = Model.Query }))
}
else
{
    <p>暂无数据!</p>
}

示例2:使用API调用分页数据

除了使用MVC视图来展示分页数据以外,我们还可以创建API来使用JavaScript动态调用分页数据并进行渲染。

以下是部分API代码实现:

[HttpGet]
public IActionResult Get(Guid appId, string startIndex, string count)
{
    var pageSize = Convert.ToInt32(count);
    var pageIndex = Convert.ToInt32(startIndex) / pageSize + 1;

    var data = _context.NewsList
        .Where(n => n.AppId == appId)
        .OrderByDescending(n => n.Date)
        .Skip((pageIndex - 1) * pageSize)
        .Take(pageSize).ToList();

    var totalCount = _context.NewsList.Where(n => n.AppId == appId).Count();

    var totalPage = Math.Ceiling((double)totalCount / pageSize);

    var result = new
    {
        data,
        pageIndex,
        pageSize,
        totalCount,
        totalPage
    };

    return Ok(result);
}

以下是使用Vue.js调用分页API并渲染数据的完整代码:

var app = new Vue({
  el: '#app',
  data: {
    pageIndex: 1,
    pageSize: 10,
    totalCount: 0,
    totalPage: 0,
    newsList: [],
    loading: false
  },
  created: function () {
    this.fetchNewsData();
  },
  methods: {
    fetchNewsData: function () {
      this.loading = true;
      var self = this;
      axios.get('/api/news', {
        params: {
          appId: '{{ appId }}',
          startIndex: (this.pageIndex - 1) * this.pageSize,
          count: this.pageSize
        }
      }).then(function (response) {
        var data = response.data;
        self.newsList = data.data;
        self.pageIndex = data.pageIndex;
        self.pageSize = data.pageSize;
        self.totalCount = data.totalCount;
        self.totalPage = data.totalPage;
        self.loading = false;
      }).catch(function (error) {
        console.log(error);
        self.loading = false;
      });
    },
    nextPage: function () {
      if (this.pageIndex < this.totalPage) {
        this.pageIndex ++;
        this.fetchNewsData();
      }
    },
    previousPage: function () {
      if (this.pageIndex > 1) {
        this.pageIndex --;
        this.fetchNewsData();
      }
    },
    setPage: function (pageIndex) {
      this.pageIndex = pageIndex;
      this.fetchNewsData();
    }
  }
});

以上就是ASP.NET MVC分页的完整攻略,包括MVC分页原理、分页代码实现过程以及示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net MVC分页代码分享 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#实现将一个字符串进行翻转显示的6种方法

    下面给出C#实现将一个字符串进行翻转显示的6种方法的完整攻略。 步骤1:分析题目要求 题目要求将一个字符串进行翻转显示,该字符串可以包含中英文、数字、标点符号,我们需要使用C#实现该功能,并提供6种实现方法。 步骤2:C#实现翻转字符串 方法1:使用Array.Reverse()方法 我们可以使用C#的Array.Reverse()方法来实现字符串翻转。该方…

    C# 2023年6月7日
    00
  • C#递归应用之实现JS文件的自动引用

    下面我将详细讲解“C#递归应用之实现JS文件的自动引用”的完整攻略,包括过程和示例。 背景介绍 在网页中,经常需要引入多个JS文件,但是手动一个一个引入比较麻烦,而且还容易出错。因此,我们可以通过C#递归应用实现JS文件的自动引用。 实现步骤 具体实现步骤如下: 获取指定文件夹下所有.js文件的路径 将这些路径添加到HTML代码的头文件中 如果JS文件中还有…

    C# 2023年6月7日
    00
  • C#词法分析器之转换DFA详解

    C#词法分析器之转换DFA详解 什么是词法分析? 词法分析(Lexical Analysis)是编译器中的一个步骤,也称为扫描器(Scanner)。词法分析的主要任务是将程序中的代码转换成一个个Token(标记)。Token是指单词或符号等,是编译器中的最小单位。 词法分析器的输入是源代码,识别出其中的每个Token,每个Token包括 Token种类 和 …

    C# 2023年6月7日
    00
  • Asp.NET 多层登陆实现代码

    本文将详细讲解如何利用 Asp.NET 实现多层登陆,以下是完整的实现攻略: 第一步:创建用户数据库 在创建用户数据库之前,必须先安装 Microsoft SQL Server 数据库并创建一个新的数据库。可以按照以下步骤创建一个新的用户数据库: 打开 Microsoft SQL Server 的管理工具(如SqlServer Management Stud…

    C# 2023年5月31日
    00
  • 如何在C# 中使用 FFmpeg.NET

    使用 FFmpeg.NET 可以方便地在 C# 项目中进行音视频处理。以下是使用 FFmpeg.NET 的完整攻略。 环境搭建 下载并安装 FFmpeg 库。可以从 https://www.ffmpeg.org/download.html 下载对应平台的二进制版本。例如,Windows 平台可以下载 Windows 版本的 FFmpeg。 在 C# 项目中添…

    C# 2023年6月1日
    00
  • Asp.Net Core使用swagger生成api文档的完整步骤

    在ASP.NET Core中,可以使用Swagger来生成API文档。本攻略将深入探讨如何使用Swagger生成API文档,并提供两个示例说明。 使用Swagger生成API文档 使用Swagger生成API文档的步骤如下: 1. 添加Swashbuckle.AspNetCore包 我们需要添加Swashbuckle.AspNetCore包来使用Swagge…

    C# 2023年5月17日
    00
  • C#如何连接MySQL数据库

    下面是关于如何连接MySQL数据库的详细攻略: 准备工作 在使用 C# 连接MySQL数据库之前,我们需要先进行一些准备工作: 安装 MySQL Connector/NET。下载链接:https://dev.mysql.com/downloads/connector/net/ 在我们的项目中添加对 MySQL Connector/NET 的引用。 为了便于操…

    C# 2023年5月15日
    00
  • C# NetRemoting实现双向通信

    C#NetRemoting是一种在不同应用程序域之间进行远程过程调用(RPC)的技术,可以实现客户端与服务器之间的双向通信。下面是C#NetRemoting实现双向通信的完整攻略: 步骤一:创建接口 第一步是创建一个接口,定义双向通信的方法和事件,例如: public interface IRemoteObject { // 定义客户端向服务器发送消息的方法…

    C# 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部