asp.net中ajax返回数据太大,如何分页处理

asp.net中 ajax返回的json数据量很大,如何进行分页处理呢
后台获取ajax数据为

  [WebMethod]
  private static string  DataTable BinData(string dtFrom, string dtTo, string workshop, string line, string type)
        {
             string where = "";
            if ((dtFrom != null) && (dtFrom.Length > 0))
            {
                where += "and CONVERT(varchar(10), f.operate_date, 120) >='" + dtFrom + "'";
            }
            if ((dtTo != null) && (dtTo.Length > 0))
            {
                where += " and CONVERT(varchar(10), f.operate_date, 120) <='" + dtTo + "'";
            }

            if ((workshop.Length > 0) && (workshop != "请选择"))
            {
                where += "and c.name ='" + workshop + "'";
            }
            if ((line.Length > 0) && (line != "请选择"))
            {
                where += "and d.name ='" + line + "'";
            }
            if (type != "请选择")
            {
                where += "and b.type = '" + type + "'";
            }
            string sql = "    select distinct   a.name as 设备名称,a.code as 设备编码,c.name as 所属车间, d.name as 所属产线,case b.type when '1'then '日保养'when '2'then '周保养' when '3'then '月保养' end  as 保养类型,e.year as 保养年度, case e.status  when '2' then '正在执行' when '4' then '已经完成'end as 保养状态,item as 日期索引,   f.operate_date as 保养时间    from equipment a left join equipment_maintain b on a.id = b.equipment_id   left join work_shop c on a.shop_id =c.id    left join work_line d on a.line_id =d.id left join equipment_maintain_plan e on a.id = e.equipment_id left join equipment_maintain_plan_detail f on f.order_id = e.id where  b.status='0'    and b.type != '1' and is_done =1 and operate_date !='0001-01-01 00:00:00.0000000' " + where + " ORDER BY e.year DESC, item ASC";
            DataTable tb = DBSql.GetDataTable(sql, "1");
               string json = Newtonsoft.Json.JsonConvert.SerializeObject(tb); //使用json工具类的对象转为JSON                         
            return json;
        }


前台处理为


 <table class="site-table table-hover">
                    <thead>
                        <tr>
                            <th style="text-align: center;">设备编码</th>
                            <th style="text-align: center;">设备名称</th>                      
                            <th style="text-align: center;">保养类型</th>
                            <th style="text-align: center;">所属车间</th>
                            <th style="text-align: center;">所属产线</th>
                            <th style="text-align: center;">保养年度</th>
                            <th style="text-align: center;">保养状态</th>
                            <th style="text-align: center;">日期索引</th>
                            <th style="text-align: center;">保养时间</th>
                        </tr>
                    </thead>
                    <tbody  id="table-body">
                    </tbody>
                </table>
               <script>
        var myDiv = document.getElementById("Submit1");
        myDiv.addEventListener("click", function () {
            var dtFrom = document.getElementById("dtFrom").value;
            var dtTo = document.getElementById("dtTo").value;
          


            const selectedworkshopValue = document.getElementById("workshop");
            const selectedValue1 = selectedworkshopValue.value;

            const selectedlineValue = document.getElementById("line");
            const selectedValue2 = selectedlineValue.value;

            const selectedTypeValue = document.getElementById("type");
            const selectedValue3 = selectedTypeValue.value;
  
          
                $.ajax({
                    type: 'POST',
                    url: 'Web4.aspx/Get_Data',
                    dataType: 'json',
                    data: JSON.stringify({ dtFrom: dtFrom, dtTo: dtTo, workshop: selectedValue1, line: selectedValue2, type: selectedValue3 }),
                    async: true,
                    contentType: 'application/json; charset=utf-8',
                    success: function (data) {

                        if (data.d != null) {
                            var tableBody = document.getElementById("table-body");
                            tableBody.innerHTML = "";
                            $.each(JSON.parse(data.d), function (index, item) {

                                var tr = document.createElement("tr");
                                tr.innerHTML += `
                                     <td>${item.设备编码}</td>
                                     <td>${item.设备名称}</td>
                                     <td>${item.保养类型}</td>
                                     <td>${item.所属车间}</td>
                                     <td>${item.所属产线}</td>
                                     <td>${item.保养年度}</td>                                   
                                     <td>${item.保养状态}</td>
                                     <td>${item.日期索引}</td>
                                     <td>${item.保养时间}</td>
                                     </tr>`
                                tableBody.appendChild(tr);
                            });
                        }
                    }, error: function (xhr, status, error) {
                        alert(error);
                    }

                });
            
        });
    </script>

请问应该如何分页处理呢,才能展示数据

如果数据太多,那就不能 一次性返回所有的数据
可以让前端 传 指定页 和 每页数据;
比如 先查第一页, 每页显示 10条; 第一页需要返回 总数据条数,便于后续的分页计算
前台 根据 总数据条数 和 每页10条,进行分页计算;
接下来 就是 查 第二页 10条,再请求后端一次;
查第三页 10条,再请求后端一次;
依次类推

帮你用GPT查了一下,你参考一下是否可以解决:
要实现分页处理,你需要在后端代码中对查询结果进行分页,并将分页的信息返回给前端。同时,在前端代码中添加分页的控件和事件处理。

首先,在后端代码中进行分页处理。你可以添加两个参数:当前页码(page)和每页显示的数据条数(pageSize)。修改 SQL 查询语句,添加对应的 OFFSET 和 FETCH 子句,实现分页功能。修改后的代码如下所示:

[WebMethod]
private static string DataTable BinData(string dtFrom, string dtTo, string workshop, string line, string type, int page, int pageSize)
{
    // ... (省略原有的代码)
    
    // 添加分页处理
    int offset = (page - 1) * pageSize;  // 计算偏移量
    sql += $" OFFSET {offset} ROWS FETCH NEXT {pageSize} ROWS ONLY";  // 添加 OFFSET 和 FETCH 子句
    
    DataTable tb = DBSql.GetDataTable(sql, "1");
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(tb);                        
    return json;
}

接下来,在前端代码中添加分页的控件和事件处理。你需要添加一个分页导航栏,并为每个页码添加点击事件,触发新的 AJAX 请求获取对应页码的数据。修改后的代码如下所示:

<!-- 在 table 下方添加分页导航 -->
<div class="pagination">
    <ul id="pagination-list" class="pagination-list"></ul>
</div>

<script>
var currentPage = 1;  // 当前页码
var pageSize = 10;   // 每页显示的数据条数

// 设置页码按钮的点击事件
function setPageClickEvent() {
    var paginationList = document.getElementById("pagination-list");
    var paginationItems = paginationList.getElementsByTagName("li");

    for (var i = 0; i < paginationItems.length; i++) {
        paginationItems[i].addEventListener("click", function() {
            currentPage = parseInt(this.innerText);  // 点击页码后,更新当前页码
            getData();
        });
    }
}

// 获取数据并渲染表格
function getData() {
    var dtFrom = document.getElementById("dtFrom").value;
    var dtTo = document.getElementById("dtTo").value;
    var selectedworkshopValue = document.getElementById("workshop").value;
    var selectedlineValue = document.getElementById("line").value;
    var selectedTypeValue = document.getElementById("type").value;

    $.ajax({
        type: 'POST',
        url: 'Web4.aspx/Get_Data',
        dataType: 'json',
        data: JSON.stringify({ dtFrom: dtFrom, dtTo: dtTo, workshop: selectedworkshopValue, line: selectedlineValue, type: selectedTypeValue, page: currentPage, pageSize: pageSize }),
        async: true,
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            if (data.d != null) {
                var tableBody = document.getElementById("table-body");
                var paginationList = document.getElementById("pagination-list");
                tableBody.innerHTML = "";

                $.each(JSON.parse(data.d), function (index, item) {
                    var tr = document.createElement("tr");
                    tr.innerHTML += `
                        <td>${item.设备编码}</td>
                        <td>${item.设备名称}</td>
                        <td>${item.保养类型}</td>
                        <td>${item.所属车间}</td>
                        <td>${item.所属产线}</td>
                        <td>${item.保养年度}</td>                                   
                        <td>${item.保养状态}</td>
                        <td>${item.日期索引}</td>
                        <td>${item.保养时间}</td>
                    `;
                    tableBody.appendChild(tr);
                });

                // 渲染分页导航栏
                paginationList.innerHTML = "";
                var totalPages = Math.ceil(tableBody.childNodes.length / pageSize);  // 总页数

                for (var i = 1; i <= totalPages; i++) {
                    var li = document.createElement("li");
                    li.innerText = i;
                    if (i === currentPage) {
                        li.className = "active";
                    }
                    paginationList.appendChild(li);
                }

                setPageClickEvent();  // 绑定页码按钮的点击事件
            }
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
}

// 初始化页面,获取第一页数据
getData();
</script>

以上代码添加了分页导航栏,根据返回的数据条数计算总页数,并动态生成页码按钮。点击按钮后,更新当前页码并重新获取对应页码的数据,并渲染表格。同时,为每个页码按钮添加点击事件,触发新的 AJAX 请求。

🟢引入数据显示控件,比较方便,你参考一下

ASP.NET快速入门 GridView控件使用

https://m.baidu.com/video/page?pd=video_page&nid=9814831172923444353&sign=746343718710612016&word=ASP.net+%E4%BD%BF%E7%94%A8GridView%E6%8E%A7%E4%BB%B6&oword=ASP.net+%E4%BD%BF%E7%94%A8GridView%E6%8E%A7%E4%BB%B6&atn=index&frsrcid=48304&ext=%7B%22jsy%22%3A1%7D&top=%7B%22sfhs%22%3A1%2C%22_hold%22%3A2%7D&fr0=A&fr1=A&ms=1&lid=10870252504747131595&referlid=10870252504747131595&frorder=1&_t=1691402872836

sql加上limit限制达到分页 limit的具体参数通过前端参数传递 看明白limit的原理 前端就会明白怎么传递参数了

使用 ROW_NUMBER() 函数,进行分页。



SELECT column1, column2, ...
FROM (
    SELECT column1, column2, ..., ROW_NUMBER() OVER (ORDER BY column1) AS row_num
    FROM your_table
) AS numbered_table
WHERE row_num BETWEEN 11 AND 15;

以上示例也将从表中按照 column1 的顺序获取第 11 到 15 行的数据。

【以下回答由 GPT 生成】

在处理返回的大量JSON数据时,可以使用分页来减小数据量,提高性能。下面是一个可以实现分页处理的示例代码:

首先,在前端页面添加分页控件。在HTML文件中添加以下代码:

<div id="pagination" class="pagination"></div>

接下来,在JavaScript中使用jQuery的AJAX方法发送请求,并在成功回调函数中设置分页功能。在JavaScript文件中添加以下代码:

var currentPage = 1;  // 当前页码
var itemsPerPage = 10;  // 每页显示的记录数

$(document).ready(function() {
    getData(currentPage);  // 页面加载时获取第一页数据
});

function getData(page) {
    // 构建请求参数,根据需要传递给后台方法
    var dtFrom = $('#dtFrom').val();
    var dtTo = $('#dtTo').val();
    var workshop = $('#workshop').val();
    var line = $('#line').val();
    var type = $('#type').val();
    var requestData = {
        dtFrom: dtFrom,
        dtTo: dtTo,
        workshop: workshop,
        line: line,
        type: type,
        page: page,  //传递当前页码到后台方法
        itemsPerPage: itemsPerPage  //传递每页显示的记录数到后台方法
    };

    // 发送AJAX请求
    $.ajax({
        type: "POST",
        url: "YourPage.aspx/BinData",  // 修改为你的后台方法的URL
        data: JSON.stringify(requestData),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function(response) {
            var data = JSON.parse(response.d);

            // 处理返回的数据,更新前端页面
            // ...

            // 更新分页控件
            updatePagination(page, data.totalCount);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            console.log("Error: " + errorThrown);
        }
    });
}

function updatePagination(currentPage, totalCount) {
    var totalPages = Math.ceil(totalCount / itemsPerPage);  // 计算总页数
    var pagination = $('#pagination');

    pagination.twbsPagination('destroy');  // 清空分页控件

    // 初始化分页控件
    pagination.twbsPagination({
        totalPages: totalPages,
        visiblePages: 5,  // 设置显示的页码数
        startPage: currentPage,
        onPageClick: function(event, page) {
            // 点击页码时获取对应页面的数据
            getData(page);
        }
    });
}

然后,在后台的WebMethod方法中进行分页处理,在C#文件中修改BinData方法如下:

[WebMethod]
public static string BinData(string dtFrom, string dtTo, string workshop, string line, string type, int page, int itemsPerPage)
{
    // ...

    // 分页查询数据库中的数据
    string pagedSql = "SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber, * FROM (" + sql + ") AS Result) AS PagedResult WHERE RowNumber >= @StartRow AND RowNumber <= @EndRow";
    int startRow = (page - 1) * itemsPerPage + 1;
    int endRow = startRow + itemsPerPage - 1;
    SqlParameter[] parameters = new SqlParameter[]
    {
        new SqlParameter("@StartRow", startRow),
        new SqlParameter("@EndRow", endRow)
    };
    string connectionString = "YourConnectionString";  // 修改为你的数据库连接字符串
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(pagedSql, connection);
        command.Parameters.AddRange(parameters);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        // 处理查询结果,生成JSON数据
        // ...
    }
}

在以上代码中,我们使用了ROW_NUMBER()函数进行分页查询,并且在前端的JavaScript中通过AJAX请求传递了pageitemsPerPage两个参数,后台方法根据这些参数进行分页查询。在查询结果中,我们只返回当前页的数据,并通过计算总记录数来更新分页控件。

请注意,上述代码仅供参考,具体的实现要根据你的业务需求和数据库结构进行调整。如果你有其他问题,请告诉我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在原先排序好的sql用limit、offset,limit是页大小,offset是跳过多少跳数据(页码-1)*页大小。
你这还有个sql注入问题,可以用sql参数化避免


select * from (原有sql) a  LIMIT 10 OFFSET 20;