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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:33