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
相关产品推荐
相关产品推荐

