You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET中不使用Entity Framework,通过Ajax和jQuery实现DataTable

不用Entity Framework实现ASP.NET MVC + jQuery DataTable(Ajax版)

完全可行,DataTable仅要求后端返回符合规范的JSON数据,和是否使用Entity Framework无关。下面是具体实现步骤:

1. 后端编写返回JSON的Action

保留你原有调用存储过程获取Goods数据的逻辑,只需把数据包装成DataTable要求的格式返回即可。DataTable期望的JSON结构包含draw(请求标识,原样返回)、recordsTotal(总记录数)、recordsFiltered(过滤后的记录数,无过滤则等于总记录数)、data(当前页的数据列表)。

示例代码:

public ActionResult GetGoodsData(int draw, int start, int length)
{
    // 调用存储过程获取分页数据,替换成你自己的存储过程调用逻辑
    var goodsList = FetchGoodsWithPagination(start, length);
    // 获取总记录数,建议用单独的存储过程或查询实现
    var totalCount = GetTotalGoodsCount();

    // 构造DataTable需要的响应结构
    var response = new
    {
        draw = draw,
        recordsTotal = totalCount,
        recordsFiltered = totalCount, // 若要后端搜索过滤,这里改为过滤后的数量
        data = goodsList
    };

    return Json(response, JsonRequestBehavior.AllowGet);
}

// 示例:从存储过程获取分页数据
private List<Goods> FetchGoodsWithPagination(int start, int pageSize)
{
    var goods = new List<Goods>();
    var connString = ConfigurationManager.ConnectionStrings["YourDbConn"].ConnectionString;
    
    using (var conn = new SqlConnection(connString))
    using (var cmd = new SqlCommand("SP_GetGoodsPaged", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        // 根据你的存储过程参数调整,这里传递分页起始索引和每页条数
        cmd.Parameters.AddWithValue("@StartIndex", start);
        cmd.Parameters.AddWithValue("@PageSize", pageSize);

        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                goods.Add(new Goods
                {
                    Id = Convert.ToInt32(reader["Id"]),
                    Name = reader["GoodsName"].ToString(),
                    Price = Convert.ToDecimal(reader["Price"]),
                    // 其他字段对应你的Goods模型属性
                });
            }
        }
    }
    return goods;
}

// 示例:获取商品总记录数
private int GetTotalGoodsCount()
{
    var connString = ConfigurationManager.ConnectionStrings["YourDbConn"].ConnectionString;
    int count = 0;
    
    using (var conn = new SqlConnection(connString))
    using (var cmd = new SqlCommand("SP_GetTotalGoodsCount", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        conn.Open();
        count = Convert.ToInt32(cmd.ExecuteScalar());
    }
    return count;
}

2. 前端配置jQuery DataTable

先引入必要的资源(jQuery和DataTable的脚本、样式),然后创建空表格并初始化DataTable:

引入资源

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css">
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>

页面表格结构

<table id="goodsTable" class="display" style="width:100%">
    <thead>
        <tr>
            <th>商品ID</th>
            <th>商品名称</th>
            <th>价格</th>
            <!-- 其他列对应你的Goods字段 -->
        </tr>
    </thead>
    <tbody></tbody>
</table>

初始化DataTable脚本

$(document).ready(function() {
    $('#goodsTable').DataTable({
        processing: true, // 显示加载状态
        serverSide: true, // 启用服务器端分页/排序/过滤
        ajax: {
            url: '@Url.Action("GetGoodsData", "Goods")', // 替换成你的控制器和Action名称
            type: 'POST',
            dataType: 'json'
        },
        columns: [
            { data: 'Id' },
            { data: 'Name' },
            { data: 'Price' },
            // 列名要和后端返回的Goods属性名完全匹配
        ],
        order: [[0, 'asc']], // 默认按ID升序排序
        pageLength: 10 // 每页显示10条数据
    });
});

额外说明

  • 如果需要实现后端搜索过滤,可以在Action中接收search[value]参数,修改存储过程加入过滤逻辑,并更新recordsFiltered为过滤后的记录数。
  • 确保后端返回的Goods对象属性名和前端columns.data配置的名称完全一致,否则数据无法正确渲染。
  • 若存储过程本身不支持分页,你可以先获取所有数据再在内存中分页,但大数据量下不建议这么做,最好修改存储过程支持分页逻辑。

内容的提问来源于stack exchange,提问作者ashblossom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:25:21