ASP.NET MVC-懒加载-逐步加载数据库信息

环境:

win10, .NET 6.0


目录

问题描述

假设我数据库中有N个表,当我打开某页面时,每个表都先加载一部分(比如20条),点击表下某个按钮,再加载下一部分,如此循环直至加载完毕。

解决方案

基础版

数据库查询部分(Entity Framework)

  1. BasicPartsDbContext.cs
csharp 复制代码
using System.Data.Entity;

namespace WebApplication1.Models
{
    public class BasicPartsDbContext:DbContext
    {
        public BasicPartsDbContext() : base("name=conn1") { }
        public DbSet<BasicParts> BasicParts { get; set; }
    }
}

其中BasicParts是我的实体/模型类,数据类型与数据库中某个表一一对应,内容大概如下:

csharp 复制代码
using System.ComponentModel.DataAnnotations.Schema;

namespace WebApplication1.Models
{
    [Table("dbo.表名")]
    public class BasicParts
    {
        // 对应列
    }
}

"name=conn1"是指使用此数据库配置。该配置在项目根目录下的Web.config中:

  1. BasicPartsRepository.cs
csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class BasicPartsRepository
    {
        private BasicPartsDbContext _context;

        public BasicPartsRepository(BasicPartsDbContext context)
        {
            _context = context;
        }

        public List<BasicParts> GetPagedData(int pageIndex, int pageSize) {
            return _context.BasicParts.OrderBy(i => i.id)
                .Skip(pageIndex * pageSize)
                .Take(pageSize)
                .ToList();
        }
    }
}

控制器

csharp 复制代码
public class HomeController : Controller {
	private BasicPartsRepository _basicPartsRepository;
	...
	
	public ActionResult BasicPartsView() { 
    	return View();
	}

	[HttpGet]
	public JsonResult LoadMoreBasicParts(int pageIndex, int pageSize) {
    	var data = _basicPartsRepository.GetPagedData(pageIndex, pageSize);
    	return Json(data, JsonRequestBehavior.AllowGet);
	}
	...
}

前端页面

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Load More Data Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="data-container">
        <!-- 这里将显示从服务器加载的数据 -->

    </div>
    
    <button id="load-more">加载更多</button>

    <script>
        var pageIndex = 0;
        var pageSize = 20;

        function loadMoreData() {
            $.ajax({
                url: '/Home/LoadMoreBasicParts',
                data: {
                    pageIndex: pageIndex,
                    pageSize: pageSize
                },
                success: function (data) {
                    pageIndex++;
                    // 将新加载的数据追加到页面上
                    data.forEach(function (item) {
                        $('#data-container').append('<p>' + item.name + '</p>');
                    });
                }
            });
        }

        $(document).ready(function () {
            $('#load-more').on('click', function () {
                loadMoreData();
            });

            // 页面加载完成时,加载初始数据
            loadMoreData();
        });
    </script>
</body>
</html>

加载到表格版

其他部分保持不变,只修改前端:

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Load More Data into Table</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <table id="data-table" border="1">
        <thead>
            <tr>
                <th>No.</th>
                <th>名称</th>
                <th>序列</th>
                <th>描述</th>
                <th>类型</th>
            </tr>
        </thead>
        <tbody>
            <!-- 这里是数据行 -->
        </tbody>
    </table>
    <button id="load-more">加载更多</button>

    <script>
        var pageIndex = 0;
        var pageSize = 20;

        function loadMoreData() {
            $.ajax({
                url: '/Home/LoadMoreBasicParts',
                data: {
                    pageIndex: pageIndex,
                    pageSize: pageSize
                },
                success: function (data) {
                    pageIndex++;
                    // 将新加载的数据追加到表格中
                    data.forEach(function (item) {
                        $('#data-table tbody').append(
                            '<tr>' +
                            '<td>' + item.id + '</td>' +
                            '<td>' + item.name + '</td>' +
                            '<td>' + item.seq + '</td>' +
                            '<td>' + item.info + '</td>' +
                            '<td>' + item.stype + '</td>' +
                            '</tr>'
                        );
                    });
                }
            });
        }

        $(document).ready(function () {
            $('#load-more').on('click', function () {
                loadMoreData();
            });

            // 页面加载完成时,加载初始数据
            loadMoreData();
        });
    </script>
</body>
</html>
相关推荐
邂逅you10 分钟前
用python操作mysql之pymysql库基本操作
数据库·python·mysql
心 一14 分钟前
接口安全测试实战:从数据库错误泄露看如何构建安全防线
数据库·安全
点灯小铭23 分钟前
基于单片机的PID调节脉动真空灭菌器上位机远程监控设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计
小高Baby@30 分钟前
Redis Key的设计
数据库·redis·缓存
q_19132846951 小时前
基于RuoYi框架+Mysql的汽车进销存后台管理系统
数据库·vue.js·spring boot·mysql·汽车·个人开发·若依
wuyunhang1234562 小时前
MySQL----锁
数据库·mysql
悟能不能悟2 小时前
springboot在DTO使用service,怎么写
java·数据库·spring boot
达瓦里氏1232 小时前
重排反应是什么?从分子变化到四大关键特征解析
数据库·学习·化学
电话交换机IPPBX-3CX2 小时前
Grafana图表与电话交换机的结合
数据库·mysql·grafana·ip pbx·电话交换机
IT 小阿姨(数据库)2 小时前
PostgreSQL REST API 介绍
运维·数据库·sql·postgresql·centos