ASP.NET Core添加评论时TicketController的Create方法报空引用异常
问题根因
- 空引用报错:请求进入POST Create接口时,传入的TicketVM参数中的Ticket属性未被赋值为null,直接访问
obj.Ticket.Ticket_Id就会触发空引用异常。 - 提交评论触发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
相关产品推荐
相关产品推荐

