You need to enable JavaScript to run this app. ASP.NET Core添加评论时TicketController的Create方法报空引用异常
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core添加评论时TicketController的Create方法报空引用异常

问题根因

  1. 空引用报错:请求进入POST Create接口时,传入的TicketVM参数中的Ticket属性未被赋值为null,直接访问obj.Ticket.Ticket_Id就会触发空引用异常。
  2. 提交评论触发Create接口:Info页的评论表单未显式指定控制器,且提交字段不完整,ASP.NET Core MVC的模型绑定和路由匹配机制在匹配Comments方法失败后,自动匹配到了参数更兼容的Create POST方法。

修复步骤

  • 第一步:修复Info视图的评论表单
    修改form标签显式指定控制器,同时添加隐藏域传递当前工单Id,确保路由精准匹配、评论能关联到对应工单:

    <form asp-action="Comments" asp-controller="Ticket">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <!-- 新增隐藏域传递当前工单Id -->
        <input type="hidden" name="Comment.Ticket_Id" value="@Model.Ticket.Ticket_Id" />
        <div class="form-group">
            <label asp-for="Message" class="control-label"></label>
            <input asp-for="Message" class="form-control" />
            <span asp-validation-for="Message" class="text-danger"></span>
        </div>
        <div class="form-group">
            <input type="submit" value="Submit" class="btn btn-primary" />
        </div>
    </form>
    

    补充说明:如果你的CommentVM没有单独定义Message字段,而是将Message作为Comment属性的子字段,需要将输入控件改为<input asp-for="Comment.Message" class="form-control" />保证模型绑定正常取值。

  • 第二步:优化Comments接口逻辑
    提交评论后跳回当前工单详情页而非工单列表,校验失败时也保留原有页面数据:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Comments(CommentVM obj)
    {
        if(ModelState.IsValid) 
        {
            _db.Commenents.Add(obj.Comment);
            _db.SaveChanges();
            // 跳回当前工单详情页
            return RedirectToAction(nameof(Info), new { id = obj.Comment.Ticket_Id });
        }
        // 校验失败时回填页面所需数据
        obj.Ticket = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == obj.Comment.Ticket_Id);
        obj.Comments = _db.Commenents.Where(f => f.Ticket_Id == obj.Comment.Ticket_Id);
        return View("Info", obj);
    }
    
  • 第三步:给Create接口加空值防护
    避免异常请求进入接口时抛出未处理的空引用异常:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create(TicketVM obj)
    {
        // 新增空值校验
        if (obj?.Ticket == null)
        {
            return RedirectToAction(nameof(Index));
        }
        if (obj.Ticket.Ticket_Id == 0)
        {
            _db.Tickets.Add(obj.Ticket);
        }
        else
        {
            _db.Tickets.Update(obj.Ticket);
        }
            
        _db.SaveChanges();
        return RedirectToAction(nameof(Index));
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 08:06:07