添加评论后刷新页面评论消失问题求助(附相关代码)
问题排查与解决方案
核心问题1:评论未持久化到数据库(最可能原因)
服务层的AddComment方法大概率仅执行了_context.ChallangeComment.Add(comment),但未调用_context.SaveChanges()。
- 逻辑分析:EF Core的DbContext会在内存中跟踪实体变化,同一个上下文内的查询能获取到未保存的实体。所以
CreateComment方法中,添加评论后立刻调用GetChallangeComment(同一上下文)能查到新评论并返回显示;但刷新页面后,新请求会创建全新的DbContext,从数据库查询时这条未保存的评论不存在,因此消失。当再次添加新评论时,如果这次调用了SaveChanges(),会把之前所有未提交的内存实体一并写入数据库,所以之前的评论会跟着显示出来。 - 修复方案:修改
AddComment方法,确保添加实体后执行持久化操作:
public void AddComment(ChallangeComment comment) { comment.CreateDate = DateTime.Now; // 建议补充创建时间字段赋值 _context.ChallangeComment.Add(comment); _context.SaveChanges(); // 必须添加此行完成数据库写入 }
核心问题2:分页排序逻辑错误
当前GetChallangeComment方法中,排序操作OrderByDescending在Skip和Take之后,这会导致分页完成后才对数据排序,完全不符合“新评论排在最前”的预期,还可能引发数据分页混乱。
- 修复方案:调整Linq操作顺序,必须先排序,再执行分页:
public Tuple<List<ChallangeComment>, int> GetChallangeComment(int ChallangeId, int pageId = 1) { int take = 10; // 假设每页显示10条评论,可根据需求调整 int skip = (pageId - 1) * take; var baseQuery = _context.ChallangeComment.Include(c=>c.User) .Where(c => !c.IsDelete && c.ChallangeID == ChallangeId); var commentList = baseQuery .OrderByDescending(c=>c.CreateDate) // 先按创建时间倒序 .Skip(skip) .Take(take) .ToList(); int pageCount = (int)Math.Ceiling(baseQuery.Count() / (double)take); return Tuple.Create(commentList, pageCount); }
前端优化建议
当前页面通过load加载评论列表,若使用AJAX提交评论,CreateComment控制器应返回PartialView而非完整View,避免返回布局页冗余内容:
- 修改控制器
CreateComment方法:
public IActionResult CreateComment(ChallangeComment comment) { comment.UserID = _userService.GetUserIdByUserName(User.Identity.Name); comment.CreateDate = DateTime.Now; _challangeService.AddComment(comment); return PartialView("ShowComment",_challangeService.GetChallangeComment(comment.ChallangeID)); }
- 在提交表单中指定AJAX成功后自动更新评论列表:
<form asp-action="CreateComment" data-ajax="true" data-ajax-success="Success" data-ajax-update="#listComment"> <textarea required class="form-control" id="comment_Comment" name="comment.Comment" rows="8"></textarea> <button type="submit">提交评论</button> </form>
内容的提问来源于stack exchange,提问作者Ste Strm
相关产品推荐
相关产品推荐

