ASP.NET Core获取URL参数时OnGetid方法未触发问题求助
Razor Pages中OnGetid方法未被调用的原因及解决方法
问题场景
通过前端代码创建跳转链接,URL携带id参数能正常打开目标页面,但后端定义的OnGetid方法始终未被触发:
前端跳转代码:
<div class="joboffer" onclick="location.href='/Jobs/JobOverview?id=@elem.Id';" style="cursor: pointer;"> <p>@elem.Title</p> </div>
后端处理代码:
public async Task<IActionResult> OnGetid(string id){ if (!_2_LogIn.IsLoggedIn) { await Response.WriteAsync("<script>alert('Nicht so schnell!!!')</script>"); return BadRequest(); } else { // 处理url参数 return Page(); } }
核心原因
Razor Pages的GET请求处理方法遵循严格的命名规则:
- 默认的GET请求会触发
OnGet方法(无自定义action名称时) - 命名格式为
OnGet[ActionName]的方法,需要在URL中通过handler=[ActionName]指定要调用的action
你的代码中,OnGetid属于带自定义action的GET方法(action名为id),但跳转URL仅传递了id参数,没有指定handler=id,因此Razor Pages会默认寻找并调用OnGet方法(如果存在),而非OnGetid。
两种解决方法
方法一:改用默认OnGet方法(推荐)
直接使用默认的OnGet方法接收id参数,无需额外指定handler:
public async Task<IActionResult> OnGet(string id){ if (!_2_LogIn.IsLoggedIn) { await Response.WriteAsync("<script>alert('Nicht so schnell!!!')</script>"); return BadRequest(); } else { // 处理id参数 return Page(); } }
此时原跳转URL无需修改,id参数会自动绑定到方法参数中。
方法二:保留OnGetid方法,修改跳转URL
如果必须使用命名处理方法,需要在跳转URL中添加handler=id参数:
<div class="joboffer" onclick="location.href='/Jobs/JobOverview?handler=id&id=@elem.Id';" style="cursor: pointer;"> <p>@elem.Title</p> </div>
这样Razor Pages会识别到handler=id,自动调用对应的OnGetid方法,同时id参数也会正常传递。
额外提示
Response.WriteAsync在返回BadRequest()后可能无法正常执行(因为BadRequest会终止响应流程),建议改用TempData传递提示信息,在前端页面通过逻辑渲染弹窗,更符合Razor Pages的开发规范。
内容的提问来源于stack exchange,提问作者inno
相关产品推荐
相关产品推荐

