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#中调用VBScript、javascript等脚本的实现代码

    在C#中调用VBScript或JavaScript脚本,可以通过使用Microsoft Script Control(MS Script Control)实现。MS Script Control是一个COM组件,用于解析和执行脚本文件,并提供了一组对象模型和方法,用于从C#代码中调用脚本。 以下是在C#中调用VBScript的示例代码: using Micr…

    C# 2023年6月7日
    00
  • C#的静态工厂方法与构造函数相比有哪些优缺点

    C#中的静态工厂方法与构造函数相比,有以下优缺点: 优点 更具有表现力:静态工厂方法可以有任意的返回类型,它们的函数名可以更好地反映其作用,可以将多个构造函数重载的实现合并为一个方法。 更加可读性:静态工厂方法可以通过名称来描述对象的创建语义,比如CreateInstance、FromValue、CreateValidator等等,让用户更容易理解对象的含义…

    C# 2023年6月3日
    00
  • C# DataSet查看返回结果集的实现

    以下是关于“C# DataSet 查看返回结果集的实现”完整攻略的讲解。 什么是 DataSet 首先需要了解什么是 DataSet。DataSet 是 C# 中的一种数据类型,用于表示一组数据集合。DataSet 可以包含多个 DataTable,每个 DataTable 可以包含多个 DataColumn,每个 DataColumn 可以有自己的数据类型…

    C# 2023年5月15日
    00
  • C# 实现winform软件最小化到系统托盘,开机自启动

    C# 实现winform软件最小化到系统托盘,开机自启动   问题描述   用户的电脑是win7系统,应用系统在用户电脑上运行时部分功能需要访问注册表,但是使用这些功能时会提示用户没有权限访问注册表。原因分析   win7及后续高版本系统对用户的权限控制比较严,就算用户的权限较高,但用户启动程序时默认还是以普通用户的权限启动,因此造成应用程序访问操作系统相关…

    C# 2023年5月11日
    00
  • C#调用C++版本dll时的类型转换需要注意的问题小结

    以下是详细的攻略。 标题 “C#调用C++版本dll时的类型转换需要注意的问题小结” 前言 在C#开发中,调用C++版本的dll时,需要进行类型转换。若不注意,可能会出现类型转换错误,导致程序崩溃。因此需要注意一些问题。 正文 问题1:传递指针类型 在C#中无法直接传递C++中的指针类型,需要通过IntPtr类型进行转换。 例如,C++中的函数声明如下: v…

    C# 2023年5月15日
    00
  • 五步掌握OOM框架AutoMapper基本使用

    五步掌握OOM框架AutoMapper基本使用 第一步:安装AutoMapper 在使用AutoMapper之前,我们需要将其引入项目中,可以通过NuGet包管理器安装AutoMapper。在Visual Studio中打开 NuGet 包管理器控制台(Tools > NuGet Package Manager > Package Manager…

    C# 2023年6月3日
    00
  • ASP.NET Core 3.0迁移的完美避坑指南

    ASP.NET Core 3.0迁移的完美避坑指南 ASP.NET Core 3.0是一个重大的版本更新,其中包含了许多新功能和改进。但是,由于这些更改,迁移现有的ASP.NET Core应用程序可能会遇到一些问题。在本攻略中,我们将提供一些有用的提示和技巧,以帮助您成功地将现有的ASP.NET Core应用程序迁移到3.0版本。 1. 更新NuGet包 在…

    C# 2023年5月16日
    00
  • C++学习之Lambda表达式的用法详解

    C++学习之Lambda表达式的用法详解 在本文中,我们将详细介绍C++中Lambda表达式的用法和使用场景。 什么是Lambda表达式? Lambda表达式是一种在C++11标准中引入的新功能,它允许我们将一个函数作为一个变量来使用。Lambda表达式相当于一种无名函数,可以在需要的时候定义,并且和普通函数一样具有函数的特性,包括参数、返回值、局部变量等。…

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