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

ASP.NET MVC获取表格数据提交控制器更新SQL问题排查

问题1:当前代码无法获取表格数据的核心错误

你写的两段获取数据的逻辑都存在基础DOM操作和语法问题,具体如下:

  • 第一段jQuery点击逻辑错误:
    • 更新按钮放在表格外层的div中,不属于任何<tr>标签的子元素,调用$(this).closest('tr')时向上查找不到任何行节点,返回的是空jQuery对象,后续查找节点的逻辑全部失效。
    • Razor渲染表格时,<td>标签内直接输出的是纯文本值,没有定义任何<input>表单元素,用find('input[name="xxx"]')查找输入框自然拿不到值。
    • 弹窗输出时重复引用了active变量,就算拿到值也无法正确显示orderby字段内容。
  • 第二段表格遍历逻辑错误:
    • 选择器使用了$('#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:09:27