导读:本期聚焦于小伙伴创作的《ASP.NET有哪几种常用的分页方式,分别适合什么场景》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《ASP.NET有哪几种常用的分页方式,分别适合什么场景》有用,将其分享出去将是对创作者最好的鼓励。

在ASP.NET项目开发中,当页面需要展示大量数据记录时,一次性加载所有数据会导致页面加载缓慢、内存占用过高,因此分页是必不可少的功能。不同的分页实现方式在性能、开发成本和适用场景上有明显区别,开发者可以根据项目需求选择合适的方案。

ASP.NET有哪几种常用的分页方式,分别适合什么场景

ASP.NET常用分页方式介绍

1. 使用DataPager服务端控件分页

DataPager是ASP.NET Web Forms中提供的分页控件,通常和ListView、Repeater等数据展示控件配合使用,不需要开发者手动编写分页逻辑,实现成本较低。

这种方式的优点是开发简单,只需要配置控件属性即可完成分页功能,适合数据量较小、对性能要求不高的后台管理类页面。缺点是它会先获取所有数据再在内存中做分页,数据量较大时性能会明显下降。

以下是DataPager配合ListView的使用示例:

<asp:ListView ID="lvData" runat="server" DataSourceID="sqlDataSource">
    <ItemTemplate>
        <tr>
            <td><%# Eval("Id") %></td>
            <td><%# Eval("UserName") %></td>
            <td><%# Eval("CreateTime") %></td>
        </tr>
    </ItemTemplate>
    <LayoutTemplate>
        <table>
            <tr>
                <th>ID</th>
                <th>用户名</th>
                <th>创建时间</th>
            </tr>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
        </table>
        <asp:DataPager ID="dpData" runat="server" PageSize="10">
            <Fields>
                <asp:NextPreviousPagerField ShowFirstPageButton="true" ShowLastPageButton="true" />
                <asp:NumericPagerField />
            </Fields>
        </asp:DataPager>
    </LayoutTemplate>
</asp:ListView>
<asp:SqlDataSource ID="sqlDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:TestDB %>"
    SelectCommand="SELECT Id, UserName, CreateTime FROM UserInfo">
</asp:SqlDataSource>

2. 自定义逻辑分页

自定义逻辑分页是指开发者手动编写分页逻辑,先查询出所有符合条件的数据,再根据当前页码和每页条数截取对应部分的数据展示到页面上。

这种方式的实现难度适中,不需要依赖特定控件,适用于数据量中等、不想编写复杂数据库存储过程的场景。缺点是同样需要先把全量数据加载到内存中,数据量超过万级时性能会变差。

以下是自定义分页的后台代码示例:

// 获取分页数据的方法
public List<UserInfo> GetPagedData(int pageIndex, int pageSize, out int totalCount)
{
    // 模拟从数据库查询全量数据
    List<UserInfo> allData = GetAllUserInfoFromDB();
    totalCount = allData.Count;
    // 计算跳过的记录数
    int skipCount = (pageIndex - 1) * pageSize;
    // 截取当前页的数据
    return allData.Skip(skipCount).Take(pageSize).ToList();
}

// 用户信息实体类
public class UserInfo
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public DateTime CreateTime { get; set; }
}

3. 数据库存储过程分页

存储过程分页是将分页逻辑放在数据库层面实现,只查询当前页需要的数据返回给应用层,不需要加载全量数据,性能优势非常明显。

这种方式的优点是性能最优,适合数据量超过十万级的大数据量场景,能有效减少数据库和应用层之间的数据传输量。缺点是需要编写数据库存储过程,开发和维护成本相对更高,不同数据库的存储过程语法存在差异,迁移成本较高。

以下是SQL Server的存储过程分页示例:

CREATE PROCEDURE GetUserInfoByPage
    @PageIndex INT, -- 当前页码,从1开始
    @PageSize INT, -- 每页条数
    @TotalCount INT OUTPUT -- 总记录数输出参数
AS
BEGIN
    -- 计算总记录数
    SELECT @TotalCount = COUNT(1) FROM UserInfo
    
    -- 查询当前页数据
    SELECT Id, UserName, CreateTime
    FROM (
        SELECT Id, UserName, CreateTime, ROW_NUMBER() OVER(ORDER BY CreateTime DESC) AS RowNum
        FROM UserInfo
    ) AS TempTable
    WHERE RowNum BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize
END

对应的C#调用存储过程代码:

public List<UserInfo> GetDataByProc(int pageIndex, int pageSize, out int totalCount)
{
    List<UserInfo> result = new List<UserInfo>();
    totalCount = 0;
    string connStr = "数据库连接字符串";
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        SqlCommand cmd = new SqlCommand("GetUserInfoByPage", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        // 添加输入参数
        cmd.Parameters.AddWithValue("@PageIndex", pageIndex);
        cmd.Parameters.AddWithValue("@PageSize", pageSize);
        // 添加输出参数
        SqlParameter totalParam = new SqlParameter("@TotalCount", SqlDbType.Int);
        totalParam.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(totalParam);
        
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            result.Add(new UserInfo
            {
                Id = Convert.ToInt32(reader["Id"]),
                UserName = reader["UserName"].ToString(),
                CreateTime = Convert.ToDateTime(reader["CreateTime"])
            });
        }
        reader.Close();
        // 获取总记录数
        totalCount = Convert.ToInt32(totalParam.Value);
    }
    return result;
}

4. 使用ORM框架自带分页功能

如果项目中使用Entity Framework、Dapper等ORM框架,这些框架通常都内置了分页方法,开发者可以直接调用,不需要手动编写分页逻辑。

这种方式的优点是和ORM框架结合紧密,代码简洁,开发效率高,适合使用对应ORM框架的项目。性能取决于ORM框架的分页实现逻辑,大部分ORM的分页最终也是转换为数据库层面的分页查询,性能较好。

以下是Entity Framework的分页示例:

// 使用Entity Framework分页查询
public List<UserInfo> GetDataByEF(int pageIndex, int pageSize, out int totalCount)
{
    using (TestDBContext db = new TestDBContext())
    {
        // 查询总记录数
        totalCount = db.UserInfo.Count();
        // 分页查询,Skip跳过前面的记录,Take取指定条数
        return db.UserInfo
            .OrderByDescending(u => u.CreateTime)
            .Skip((pageIndex - 1) * pageSize)
            .Take(pageSize)
            .ToList();
    }
}

不同分页方式的对比

为了更直观地选择分页方式,以下是几种分页方式的多维度对比:

分页方式实现难度性能表现适用数据量适用场景
DataPager控件分页千级以下简单后台页面、数据量小的场景
自定义逻辑分页中等万级以下中等数据量、不想写存储过程的场景
存储过程分页十万级以上大数据量、性能要求高的场景
ORM框架分页万级到十万级使用对应ORM框架的项目

分页方式选择建议

在实际项目中选择分页方式时,可以参考以下原则:

  • 如果是数据量很小的内部后台系统,优先选择DataPager控件或者ORM框架自带分页,开发效率最高。
  • 如果数据量在万级左右,且项目已经使用了ORM框架,直接使用ORM的分页功能即可,不需要额外编写存储过程。
  • 如果数据量超过十万级,或者对查询性能有较高要求,优先选择数据库存储过程分页,从根源上减少数据传输和内存占用。
  • 如果项目是老旧的Web Forms项目,且没有性能问题,可以继续使用DataPager控件,不需要重构分页逻辑。

ASP.NET分页DataPager自定义分页存储过程分页修改时间:2026-07-14 23:27:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。