ASP.NET Core 6 MVC中Controller的Get Edit方法为何被调用两次?
ASP.NET Core 6 MVC 编辑视图空引用错误排查
问题现象
调试时,Id从ShowCategory视图传递到CategoryController的EditPostGroup GET方法正常,但页面加载后提交表单时,会发送值为0的Id到POST方法,触发空引用错误:
Object reference not set to an instance of an object
核心问题原因
- 缺少隐藏字段传递GroupId:编辑视图的表单中,你注释掉了
GroupId的隐藏字段,表单提交时无法将当前编辑的GroupId传递到POST方法,导致PostGroup对象的GroupId默认值为0,后续查询数据时返回null触发空引用。 - GET与POST方法模型不匹配:GET方法返回
PostGroupViewModel,但POST方法接收PostGroup实体,即使改为接收PostGroupViewModel,没有GroupId隐藏字段依然会丢失ID值。 - PostRepository无空值检查:
GetPostGroupById方法中直接访问postGroup的属性,若传入无效ID(如0),postGroup为null时会直接抛出空引用错误。
修复步骤
1. 恢复编辑视图中的GroupId隐藏字段
在EditPostGroup视图的表单内添加隐藏字段,确保提交时传递当前编辑的ID:
<form method="post" asp-action="EditPostGroup" enctype="multipart/form-data"> <input type="hidden" asp-for="GroupId" /> <!-- 其他表单字段保持不变 --> </form>
2. 统一POST方法的接收模型(推荐)
将POST方法改为接收PostGroupViewModel,保持与GET方法模型一致,同时添加ViewData重新加载逻辑,避免返回视图时丢失下拉列表数据:
[HttpPost] public IActionResult EditPostGroup(PostGroupViewModel postGroupVM, IFormFile imgPostGroupUp) { if (!ModelState.IsValid) { var groups = _postService.GetGroupForManagePost(); ViewData["Groups"] = new SelectList(groups, "Value", "Text"); return View(postGroupVM); } var postGroup = _context.PostGroups.Find(postGroupVM.GroupId); if (postGroup == null) { return NotFound(); } // 映射ViewModel字段到实体 postGroup.GroupTitle = postGroupVM.GroupTitle; postGroup.ParentId = postGroupVM.ParentId; postGroup.IsDelete = postGroupVM.IsDelete; _postService.UpdatePostGroup(postGroup, imgPostGroupUp); return RedirectToAction("ShowCategory", "Category"); }
3. 完善PostRepository的空值检查
在GetPostGroupById方法中添加空值判断,避免无效ID导致的异常:
public PostGroupViewModel GetPostGroupById(int postGroupId) { var postGroup = _context.PostGroups.Find(postGroupId); if (postGroup == null) { return null; // 或根据业务需求抛出NotFound异常 } return new PostGroupViewModel() { GroupId = postGroup.GroupId, GroupTitle = postGroup.GroupTitle, GroupImageName = postGroup.GroupImageName, IsDelete = postGroup.IsDelete, ParentId = postGroup.ParentId }; }
4. 优化表单跳转链接(可选)
将ShowCategory视图中的硬编码链接改为Tag Helper,避免路由配置变更导致的错误:
<a asp-area="Admin" asp-controller="Category" asp-action="EditPostGroup" asp-route-id="@item.GroupId" class="btn btn-primary btn-md"> Edit </a>
内容的提问来源于stack exchange,提问作者n.e
相关产品推荐
相关产品推荐

