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

ASP.NET Core 7 Razor Pages中如何防止页面重载时重复提交表单(非MVC)

解决ASP.NET Core 7 Razor Pages页面重载重复提交表单的问题

核心方案:Post/Redirect/Get (PRG) 模式

这是避免重复提交的标准做法,原理是表单提交后,服务器不直接返回页面,而是重定向到一个GET请求的页面。这样刷新页面时,浏览器只会执行GET请求,不会重复触发之前的POST提交操作。

具体实现步骤

  1. 在页面模型的POST处理方法中,完成表单逻辑后,用RedirectToPage方法重定向回当前页面或目标页面:
public IActionResult OnPost()
{
    // 执行表单提交逻辑,比如数据入库、业务处理
    // ...

    // 重定向到当前页面(触发GET请求)
    return RedirectToPage();
}
  1. 如果需要传递提交结果提示,可借助TempData存储临时信息:
public IActionResult OnPost()
{
    // 表单处理逻辑
    // ...

    TempData["SuccessTip"] = "提交成功!";
    return RedirectToPage();
}

然后在Razor页面中读取并显示:

@if (TempData["SuccessTip"] != null)
{
    <div class="alert alert-success">@TempData["SuccessTip"]</div>
}

额外防护:防重复提交令牌

结合Razor Pages内置的防伪造令牌,可进一步避免用户多次点击提交按钮导致的重复操作。

  1. Razor页面的表单标签助手会自动生成防伪造令牌,若手动编写表单,需确保添加:
<form method="post">
    @Html.AntiForgeryToken()
    <!-- 表单输入字段 -->
    <button type="submit">提交</button>
</form>
  1. 也可通过会话记录已提交的令牌,实现自定义重复提交校验:
private readonly IHttpContextAccessor _httpContextAccessor;

public YourPageModel(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

public IActionResult OnPost()
{
    var token = Request.Form["__RequestVerificationToken"].ToString();
    var session = _httpContextAccessor.HttpContext.Session;

    // 检查当前令牌是否已提交过
    if (session.GetString(token) != null)
    {
        TempData["ErrorTip"] = "请勿重复提交!";
        return RedirectToPage();
    }

    // 标记该令牌已提交
    session.SetString(token, "submitted");

    // 表单处理逻辑
    // ...

    TempData["SuccessTip"] = "提交成功!";
    return RedirectToPage();
}

注意:需要在Program.cs中启用会话支持:

builder.Services.AddSession();
// ...
app.UseSession();

关于IsPostback的替代说明

Razor Pages基于HTTP无状态特性设计,摒弃了传统Web Forms的ViewState和IsPostback封装。PRG模式更贴合HTTP的原生设计,也是官方推荐的解决方案。

内容的提问来源于stack exchange,提问作者Yadhu Krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:03:22