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

ASP.NET Core MVC中JSON传参至控制器保存数据失败求助

问题分析与解决方法

你遇到的核心问题是AJAX传值不完整、模型绑定失败,加上前端选择器错误、后端返回值不符合异步请求逻辑,导致更新操作失败。以下是具体问题点和修正方案:


关键问题点

  1. 缺少实体标识ID:AJAX传递的JSON里没有DenoProfileID,后端无法定位要更新的数据库记录
  2. 输入值获取错误:用.html()获取input框的值是错误的,表单元素需用.val()
  3. 重复ID冲突:循环渲染的每行都用了相同的id="NetworkNumber",jQuery选择器会匹配到第一行元素
  4. 模型绑定未配置:ASP.NET Core接收JSON请求体时,必须给参数加[FromBody]标记才能完成绑定
  5. 后端返回值错误:AJAX是异步请求,返回RedirectToAction不会触发页面跳转,需返回JSON状态信息
  6. 控制台日志错误:console.log(EmployeeModel.value)是无效代码,直接打印对象即可

修正后的代码

控制器代码

[HttpPost]
public IActionResult Update([FromBody] DenoProfile denoprofile)
{
    // 验证ID是否存在
    if (denoprofile.DenoProfileID == 0)
    {
        return Json(new { success = false, message = "缺少ProfileID参数" });
    }
    
    // 用SingleOrDefault避免找不到记录时抛出异常
    var emp = db.DenoProfile.SingleOrDefault(em => em.DenoProfileID == denoprofile.DenoProfileID);
    if (emp == null)
    {
        return Json(new { success = false, message = "未找到对应记录" });
    }
    
    emp.NetworkNumber = denoprofile.NetworkNumber;
    db.Entry(emp).State = EntityState.Modified;
    db.SaveChanges();
    
    // 返回JSON状态,由前端处理后续逻辑
    return Json(new { success = true, message = "更新成功" });
}

视图代码(关键修改部分)

首先修正循环渲染的元素,去掉重复ID,改用class并添加隐藏ID字段:

<tbody>
    @foreach (var item in (IEnumerable<CRUD_Profile_Creation.Models.DenoProfile>)ViewBag.DenoProfile)
    {
        <tr align="center">
            <td>
                @Html.DisplayFor(modelItem => item.DenoProfileID)
            </td>
            <td>
                <div class="display-mode lbl-network-number">
                    @Html.DisplayFor(modelItem => item.NetworkNumber)
                </div>
                <div class="edit-mode">
                    <input type="text" class="network-number-input edit-mode" value="@item.NetworkNumber" />
                    <input type="hidden" class="deno-profile-id" value="@item.DenoProfileID" />
                </div>
            </td>
            <td>
                <button class="edit-user display-mode">Edit</button>
                <button class="save-user edit-mode">Save</button>
                <button class="cancel-user edit-mode">Cancel</button>
                <button class="btn btn-danger">@Html.ActionLink("Delete Deno Profile", "DeleteDenoProfile", new { id = item.DenoProfileID })</button>
            </td>
        </tr>
    }
</tbody>

然后修正JS逻辑:

$(function () {
    $('.edit-mode').hide();
    $('.edit-user, .cancel-user').on('click', function () {
        var tr = $(this).parents('tr:first');
        tr.find('.edit-mode, .display-mode').toggle();
    });

    $('.save-user').on('click', function () {
        var tr = $(this).parents('tr:first');
        // 正确获取input值和隐藏ID
        var networkNumber = tr.find(".network-number-input").val();
        var denoProfileID = tr.find(".deno-profile-id").val();
        
        // 构建完整的模型对象,包含必要的ID
        var employeeModel = {
            DenoProfileID: denoProfileID,
            NetworkNumber: networkNumber
        };

        console.log(employeeModel);
        
        $.ajax({
            url: "/DenoProfile/Update", // 加上根路径,避免路由歧义
            data: JSON.stringify(employeeModel),
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            success: function (response) {
                if (response.success) {
                    tr.find('.edit-mode, .display-mode').toggle();
                    // 更新页面显示的内容
                    tr.find(".lbl-network-number").text(networkNumber);
                    alert(response.message);
                } else {
                    alert(response.message);
                }
            },
            // 添加错误回调,便于调试
            error: function(xhr, status, error) {
                alert('请求出错:' + error);
                console.log(xhr.responseText);
            }
        });
    });

    $('.edit-user').on('click', function () {
        var tr = $(this).parents('tr:first');
        var networkNumber = tr.find(".network-number-input").val();
        tr.find(".lbl-network-number").text(networkNumber);
    });
})

AJAX传递JSON的实用技巧

  • 必传标识字段:更新/删除操作必须传递实体的唯一ID,后端才能定位数据
  • 强制[FromBody]:ASP.NET Core中,contentType: 'application/json'的请求必须用[FromBody]标记参数才能完成模型绑定
  • 避免重复ID:循环渲染的元素不要用固定ID,改用class或动态ID(如id="NetworkNumber_@item.DenoProfileID")
  • 处理错误场景:添加error回调,捕获网络错误、后端异常等情况,方便调试
  • 异步请求返回JSON:不要返回重定向或视图,返回包含状态和消息的JSON,由前端控制页面更新和用户提示
  • 正确获取表单值:input、select等表单元素用.val()获取值,.html()仅用于获取元素内部的HTML内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:46