在C# MVC的POST请求中如何获取旧Model数据?
解决方案:提交评论时避免重复获取视频列表数据
针对你遇到的提交评论时需要重复获取视频列表的问题,有以下几种可行方案:
1. 使用TempData存储视频列表
在首次加载页面的Get方法中,将视频列表存入TempData,提交评论时直接从TempData中取出复用:
修改Get方法:
public IActionResult MyVideos() { MyModel model = new MyModel(); model.videos = DB.GetVideos(); model.listOfComments = DB.GetComments(); model.comment = String.Empty; // 将视频列表存入TempData TempData["Videos"] = JsonConvert.SerializeObject(model.videos); return View(model); }
修改Post方法:
[HttpPost] public IActionResult SubmitComment(MyModel model) { string videoId = ... DB.uploadComment(videoId, model.comment); // 从TempData中取出视频列表并反序列化 model.videos = JsonConvert.DeserializeObject<List<Video>>(TempData["Videos"].ToString()); // 评论列表需要重新获取最新数据 model.listOfComments = DB.GetComments(); return View("MyVideos", model); }
注意:如果
Video是自定义复杂类型,需要使用Json序列化/反序列化来存储到TempData,否则可能出现类型转换问题。
2. 采用PRG(Post/Redirect/Get)模式
这是ASP.NET MVC中推荐的最佳实践,提交评论后重定向回页面的Get方法,由Get方法统一加载所有数据:
修改Post方法:
[HttpPost] public IActionResult SubmitComment(MyModel model) { string videoId = ... DB.uploadComment(videoId, model.comment); // 重定向到MyVideos的Get方法,由该方法重新加载视频和评论数据 return RedirectToAction("MyVideos"); }
这种方式虽然仍会获取视频列表,但代码更简洁规范,还能避免用户刷新页面导致重复提交评论的问题。
3. 使用AJAX异步提交评论(最优体验)
通过AJAX异步提交评论,成功后仅更新页面的评论区域,无需刷新整个页面,完全不需要重新获取视频数据:
修改cshtml页面:
<!-- 表单添加ID,取消默认提交行为 --> <form id="commentForm"> <div class="form-group"> <textarea class="form-control" id="exampleFormControlTextarea1" asp-for="comment"></textarea> <!-- 保留防伪令牌,防止CSRF攻击 --> @Html.AntiForgeryToken() </div> <button type="submit">Submit</button> </form> <!-- 评论列表容器,用于后续更新 --> <div id="commentsContainer"> @foreach (var comment in Model.listOfComments) { <div class="comment-item">@comment.Content</div> } </div> <script> document.getElementById('commentForm').addEventListener('submit', async function(e) { e.preventDefault(); const commentContent = document.getElementById('exampleFormControlTextarea1').value; const token = document.querySelector('input[name="__RequestVerificationToken"]').value; // 异步提交评论 const response = await fetch('/YourControllerName/SubmitComment', { method: 'POST', headers: { 'Content-Type': 'application/json', 'RequestVerificationToken': token }, body: JSON.stringify({ comment: commentContent }) }); if (response.ok) { // 获取最新评论列表并更新页面 const latestComments = await response.json(); const container = document.getElementById('commentsContainer'); container.innerHTML = ''; latestComments.forEach(comment => { const commentItem = document.createElement('div'); commentItem.className = 'comment-item'; commentItem.textContent = comment.Content; container.appendChild(commentItem); }); // 清空输入框 document.getElementById('exampleFormControlTextarea1').value = ''; } }); </script>
修改Post方法:
[HttpPost] public IActionResult SubmitComment(MyModel model) { string videoId = ... DB.uploadComment(videoId, model.comment); // 返回最新的评论列表 return Json(DB.GetComments()); }
这种方案用户体验最好,页面无刷新,且完全避免了重复获取视频数据的问题。
内容的提问来源于stack exchange,提问作者ALX
相关产品推荐
相关产品推荐

