You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:15:03