点击Href标签跳转页面时OnGet方法被调用两次且ID异常
场景重现
我的a标签代码:
<a href="/Text/@text.Id" class="btn btn-dark">Lire</a>
对应的后台Razor Pages OnGet方法:
public async Task<IActionResult> OnGet(Guid Id) { TextPost = await _textPostRepository.GetAsync(Id); if (TextPost.Tag.TagManagement.RestrictedToMembers) { if (!_signInManager.IsSignedIn(User)) { return RedirectToPage("/AccessDenied"); } } return Page(); }
点击该链接后,OnGet方法会被触发两次:第一次传入的Guid是正确值,第二次却是默认的00000000-0000-0000-0000-000000000000。页面最终能正常渲染,但调试时会报错,以下是可能的原因:
页面存在无效资源引用:检查页面中的
<img>、<script>、<link>等标签,是否有src或href属性为空、或者指向了/Text/这类不带Id的路径。浏览器遇到这类无效引用时,会自动发起对当前页面的请求,导致第二次调用OnGet且没有传入Id。组件/局部视图触发二次请求:如果页面中使用了局部视图、Tag Helper或自定义组件,可能这些组件的初始化逻辑错误地发起了对当前页面的请求,而且没有携带Id参数。比如某些组件的渲染代码里调用了
Url.Page但没传Id,或者有异步逻辑触发了额外请求。路由配置冲突:检查项目的路由配置(Program.cs/Startup.cs),是否同时存在带Id和不带Id的
/Text路由规则。如果路由模板允许不带Id访问,可能某个隐性逻辑触发了这条路由,导致第二次无参数请求。浏览器重试机制:虽然页面最终正常,但第一次请求可能返回了浏览器认为需要重试的状态码(比如3xx重定向但逻辑有问题),导致浏览器自动发起第二次请求。可以通过浏览器开发者工具的网络面板查看两次请求的响应状态码,排查是否有异常。
视图代码块的隐性调用:检查页面视图中的Razor代码块(
@{ ... }),是否有逻辑在渲染时发起了对当前页面的二次请求,比如错误调用了OnGet相关方法,或者使用了RedirectToPage但路径不正确。
内容的提问来源于stack exchange,提问作者mathdx

