ASP.NET Core MVC中JSON传参至控制器保存数据失败求助
问题分析与解决方法
你遇到的核心问题是AJAX传值不完整、模型绑定失败,加上前端选择器错误、后端返回值不符合异步请求逻辑,导致更新操作失败。以下是具体问题点和修正方案:
关键问题点
- 缺少实体标识ID:AJAX传递的JSON里没有
DenoProfileID,后端无法定位要更新的数据库记录 - 输入值获取错误:用
.html()获取input框的值是错误的,表单元素需用.val() - 重复ID冲突:循环渲染的每行都用了相同的
id="NetworkNumber",jQuery选择器会匹配到第一行元素 - 模型绑定未配置:ASP.NET Core接收JSON请求体时,必须给参数加
[FromBody]标记才能完成绑定 - 后端返回值错误:AJAX是异步请求,返回
RedirectToAction不会触发页面跳转,需返回JSON状态信息 - 控制台日志错误:
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
相关产品推荐
相关产品推荐

