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#中委托的概念与使用

    详解C#中委托的概念与使用 委托的概念 委托是一种类型,它可以用于封装方法、函数或Lambda表达式,并将其作为参数传递给其他方法。委托可以理解为是一个函数指针,它指向一个特定的方法。 委托是一个类,定义了一个方法的签名,可以指向任何函数,只要这个函数的参数列表和返回值类型与该委托的签名相同。C#中的委托必须先声明后使用,声明委托格式如下: delegate…

    C# 2023年6月7日
    00
  • C# 脚本引擎CS-Script的使用

    C# 脚本引擎CS-Script的使用 什么是CS-Script? CS-Script是一个用于扩展C#应用程序的开源脚本引擎。它允许您在不编译代码的情况下运行C#脚本,这使得C#脚本可以用于快速手动测试代码、构建脚本和部署小型工具等场合。 安装CS-Script 您可以使用NuGet安装CS-Script。在Visual Studio的“NuGet包管理器…

    C# 2023年6月3日
    00
  • C++ 封装 DLL 供 C# 调用详细介绍

    C++封装DLL供C#调用是一种常见的跨语言调用方式,它的主要思想是将C++中的库函数封装成一个动态链接库(DLL),供C#或其他语言调用。下面我会详细介绍如何实现这一过程。 1. 创建一个C++动态链接库 首先,我们需要创建一个C++动态链接库项目。在Visual Studio中,可以通过File->New->Project,然后选择Win32…

    C# 2023年6月7日
    00
  • asp.net Repeater 数据绑定的具体实现(图文详解)

    当我们需要在ASP.NET网站中显示重复数据时,asp.net Repeater控件是一个很好的选择。Repeater可以通过绑定数据源来在网站上显示重复的数据。以下是asp.net Repeater数据绑定的具体实现攻略。 第一步:创建一个asp.net网站 首先,打开Visual Studio并创建一个新的ASP.NET网站。可以选择任何类型的ASP.N…

    C# 2023年6月3日
    00
  • C#常用知识点简单回顾(有图有真相)

    “C#常用知识点简单回顾(有图有真相)” 的攻略主要内容包括以下几个方面: 1. C#基础语法回顾 这一部分主要讲解C#的基础语法,并通过代码示例让读者对C#的语法能够有一个初步的认识。具体内容包括以下几个方面: 1.1 基本数据类型 介绍了C#中常见的数据类型,如int,float,double等,并通过代码示例演示了如何使用这些数据类型。 1.2 条件语…

    C# 2023年6月1日
    00
  • C# System.TypeInitializationException 异常处理方案

    首先我们来简单地了解一下什么是”System.TypeInitializationException”异常。 “System.TypeInitializationException”是.NET框架中的一种异常,它通常发生在类或结构体初始化时,当初始化过程中发生错误时就会抛出该类异常。例如,在类的静态构造函数中,初始化对象时出现错误,或者在静态变量初始化期间出…

    C# 2023年5月15日
    00
  • C#使用FileSystemWatcher控件实现的文件监控功能示例

    在C#中,可以使用FileSystemWatcher控件实现文件监控功能。FileSystemWatcher控件可以监视指定目录中的文件和子目录的更改,并在发生更改时引发事件。本文将提供详解如何使用FileSystemWatcher控件实现文件监控功能的完整攻略,包括如何创建FileSystemWatcher控件、如何设置监视目录和文件类型、如何处理File…

    C# 2023年5月15日
    00
  • C#绘制实时曲线图的方法详解

    针对网站上的这篇文章“C#绘制实时曲线图的方法详解”,以下是完整的攻略: 1. 了解实时曲线图的作用和实现原理 实时曲线图主要是用于显示一些随时间变化的数据,并实时更新数据,常见的使用场景是嵌入式监控、数据采集和控制等。关于实时曲线图的实现原理,一般使用的是C#中的Graphics技术。 2. 准备工作 引入namespace: using System.D…

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