如何在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
相关产品推荐
相关产品推荐

