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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:50:25