ASP.NET MVC中Models相关问题:提交帖子回复时无法保存对应PostID如何解决
问题根因
- 你将所有帖子都放在同一个全局
<form>标签内,所有回复输入框的name属性都是相同的IndexAnswer,提交表单时只会上传第一个匹配的输入框内容,无法和当前点击回复的帖子对应 - 虽然你在提交按钮上添加了
asp-route-PostID,但单表单场景下路由值传递也会出现匹配混乱,同时你的Action方法重复接收了PostID参数,和IndexModel里已绑定的PostID属性冗余
修复方案
1. 修改视图代码,将表单移到帖子循环内部,每个帖子对应独立表单
@model CourseProject.ViewModels.IndexModel @if (Model != null) { @foreach (var post in Model.Posts) { <div class="card my-3"> <h5 class="card-header font-weight-bold"> @Html.DisplayFor(model => post.PostName) </h5> <div class="card-body"> <p class="card-text">@Html.DisplayFor(model => post.PostContent)</p> @if (User.Identity.IsAuthenticated) { <!-- 每个帖子单独对应一个提交表单,绑定当前帖子ID --> <form asp-action="TakeAnswer" asp-controller="Home" asp-route-PostID="@post.Id"> <div class="form-group"> <label asp-for="IndexAnswer">Your answer to this problem</label><br /> <input type="text" asp-for="IndexAnswer" /> </div> <div> <button type="submit" class="btn btn-primary">Reply</button> </div> </form> } </div> <div class="card-footer"> <p>Task created: @Html.DisplayFor(model => post.Date)</p> </div> </div> } }
2. 简化后端Action代码,直接使用模型绑定的属性即可
[HttpPost] public async Task<IActionResult> TakeAnswer(IndexModel model) { if (ModelState.IsValid) { // 直接用模型里已经绑定的PostID即可,不需要单独接收参数再转换 db.Answers.Add(new Answer { UserId = GetUserId, UserAnswer = model.IndexAnswer, PostId = model.PostID }); await db.SaveChangesAsync(); // 提交成功后重定向回列表页,避免用户刷新页面重复提交 return RedirectToAction(nameof(Index)); } // 验证失败时返回带数据的列表页,保留用户输入 var posts = db.Posts.ToList(); model.Posts = posts; return View("Index", model); }
内容的提问来源于stack exchange,提问作者Rostislav Kolb
相关产品推荐
相关产品推荐

