ASP.NET MVC获取表格数据提交控制器更新SQL问题排查
问题1:当前代码无法获取表格数据的核心错误
你写的两段获取数据的逻辑都存在基础DOM操作和语法问题,具体如下:
- 第一段jQuery点击逻辑错误:
- 更新按钮放在表格外层的div中,不属于任何
<tr>标签的子元素,调用$(this).closest('tr')时向上查找不到任何行节点,返回的是空jQuery对象,后续查找节点的逻辑全部失效。 - Razor渲染表格时,
<td>标签内直接输出的是纯文本值,没有定义任何<input>表单元素,用find('input[name="xxx"]')查找输入框自然拿不到值。 - 弹窗输出时重复引用了
active变量,就算拿到值也无法正确显示orderby字段内容。
- 更新按钮放在表格外层的div中,不属于任何
- 第二段表格遍历逻辑错误:
- 选择器使用了
$('#tblLookup1'),但你贴出的表格代码没有给<table>标签设置id="tblLookup1"属性,根本选不到目标表格。 - 初始化数组
TableData后用+做字符串拼接,会直接把数组转为字符串类型,无法存储结构化的行数据。 - 遍历没有跳过
<thead>内的表头行,会把表头文字也混入采集结果。
- 选择器使用了
- 额外的HTML语法错误:Name列的单元格标签写为
<td @item.Text</td>,缺少标签闭合的>,会导致DOM结构解析错乱,影响节点查找。
问题2:基于ADO.NET的MVC项目数据提交与数据库更新实现
按以下步骤修复并实现完整流程:
第一步:修正表格渲染代码
给表格加唯一ID,修复标签错误,如果需要支持行内编辑,把可编辑字段替换为表单元素,主键存隐藏域避免被篡改:
<table id="tblLookup1" class="table table-bordered"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Active</th> <th>Order By</th> </tr> </thead> <tbody> @if (ViewBag.data != null) { foreach (var item in ViewBag.data) { <tr> <td> @item.AutoID <input type="hidden" class="row-autoid" value="@item.AutoID" /> </td> <td><input type="text" class="row-text" value="@item.Text" /></td> <td><input type="checkbox" class="row-active" @(item.Active ? "checked" : "") /></td> <td><input type="number" class="row-orderby" value="@item.OrderBy" /></td> </tr> } } </tbody> </table> <!-- 把submit类型改为button,避免触发表单默认提交刷新页面 --> <input type="button" value="Update Preference" class="BtnUpdOrderId" />
第二步:修复前端数据采集与提交逻辑
遍历tbody内的业务行,组装结构化数据后通过AJAX提交到控制器:
$(".BtnUpdOrderId").off("click").on("click", function () { const updateData = []; // 只遍历tbody下的行,跳过表头 $("#tblLookup1 tbody tr").each(function () { const currentRow = $(this); updateData.push({ AutoID: currentRow.find(".row-autoid").val(), Text: currentRow.find(".row-text").val().trim(), Active: currentRow.find(".row-active").prop("checked"), OrderBy: parseInt(currentRow.find(".row-orderby").val()) }); }); // 控制台打印确认数据格式正确后再提交 console.log(updateData); $.ajax({ url: '/Home/UpdatePreference', // 替换为自己的控制器/Action路径 type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify(updateData), success: function (res) { if (res.code === 0) { alert("更新成功"); // 可按需加页面刷新或局部刷新逻辑 } else { alert("更新失败:" + res.msg); } }, error: function () { alert("网络请求异常,请重试"); } }); });
第三步:编写后端接收与ADO.NET更新逻辑
首先定义和前端字段匹配的实体类:
public class LookupPreference { public int AutoID { get; set; } public string Text { get; set; } public bool Active { get; set; } public int OrderBy { get; set; } }
在控制器中编写对应的POST Action,用ADO.NET连接数据库执行更新:
[HttpPost] public JsonResult UpdatePreference(List<LookupPreference> data) { if (data == null || data.Count == 0) { return Json(new { code = 1, msg = "提交数据为空" }); } // 从配置文件读取数据库连接字符串 string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConn"].ToString(); using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); // 开启事务保证数据一致性 SqlTransaction tran = conn.BeginTransaction(); try { foreach (var item in data) { string updateSql = @"UPDATE 你的业务表名 SET Text = @Text, Active = @Active, OrderBy = @OrderBy WHERE AutoID = @AutoID"; SqlCommand cmd = new SqlCommand(updateSql, conn, tran); // 用参数化查询避免SQL注入 cmd.Parameters.AddWithValue("@AutoID", item.AutoID); cmd.Parameters.AddWithValue("@Text", item.Text); cmd.Parameters.AddWithValue("@Active", item.Active); cmd.Parameters.AddWithValue("@OrderBy", item.OrderBy); cmd.ExecuteNonQuery(); } tran.Commit(); return Json(new { code = 0, msg = "" }); } catch (Exception ex) { tran.Rollback(); // 生产环境不要直接返回ex.Message,可替换为固定错误提示,把详细错误记日志 return Json(new { code = 1, msg = "更新时发生异常" }); } } }
优化提示:如果单次更新的数据量较大,不要用循环单条UPDATE的方式,可以改用SQL表值参数或者SqlBulkCopy做批量更新,性能会有明显提升。
内容的提问来源于stack exchange,提问作者electro_guy
相关产品推荐
相关产品推荐

