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

ASP.NET Core Razor Pages提交表单后OnGet未触发问题咨询

问题分析与解决方案

你遇到的问题是Razor Pages的HTTP动词匹配机制导致的:

  • 表单使用method="post"提交后,浏览器发送的是POST请求,Razor Pages会自动匹配执行OnPost方法,不会触发OnGet。
  • 页面刷新是POST请求处理完成后返回的视图渲染,整个过程始终处于POST请求上下文,所以OnGet不会被调用。

两种解决方式:

1. 采用PRG模式(推荐,避免重复提交)

这是Web开发的最佳实践,POST处理完成后重定向到GET请求,既会触发OnGet,也能防止用户刷新页面重复提交表单。修改你的OnPost方法:

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Fiscal_AP_Log.Pages
{
    public class IndexModel : PageModel
    {
        public void OnGet()
        {
            this.ViewData["ON_GET_MESSAGE"] = "OnGet()";
        }

        public IActionResult OnPost()
        {
            this.TempData["ON_POST_MESSAGE"] = "OnPost()";
            // 重定向到当前页面的GET请求,会触发OnGet
            return RedirectToPage();
        }
    }
}

同时修改视图,用TempData读取POST结果(重定向后ViewData会丢失数据):

<h1>Get Message = @ViewData["ON_GET_MESSAGE"]</h1>
<h1>Post Message = @TempData["ON_POST_MESSAGE"]</h1>

2. 手动在OnPost中处理OnGet的逻辑(不推荐)

如果不想重定向,可以直接在OnPost里执行OnGet的逻辑,或者手动设置对应的ViewData:

public void OnPost()
{
    // 手动调用OnGet方法,或者直接赋值ViewData
    OnGet();
    this.ViewData["ON_POST_MESSAGE"] = "OnPost()";
}

这种方式的问题是:用户刷新页面时会重新发送POST请求,可能导致重复执行OnPost里的操作(比如重复提交数据)。

补充说明

Razor Pages的核心是HTTP动词与方法的匹配:

  • GET请求 → 执行OnGet(或OnGetAsync)
  • POST请求 → 执行OnPost(或OnPostAsync)
  • 其他动词(PUT/DELETE等)同理对应OnPut/OnDelete方法

POST请求处理后默认返回当前视图,这个过程不会触发GET对应的方法,所以需要通过重定向或者手动逻辑来实现你想要的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:25:19