ASP.NET Core Razor Pages中如何正确重定向回当前页面
ASP.NET Core Razor Pages 重定向问题解决方案
问题根因梳理
- 重定向到产品页失效:你的页面路由配置了必填的
{id}参数,直接写Redirect("/product")没有传递参数,匹配不到路由 - 直接调用OnGet无效:手动调用方法不会触发Razor Pages完整的请求管道,页面渲染所需的上下文状态没有正确初始化
- 空引用异常:OnPost逻辑执行完如果要渲染当前页面,没有给Product属性赋值,前端绑定的时候就会报空
具体修复方案
1. 收藏操作完成后重定向回当前页
优先采用 PRG(Post/Redirect/Get) 标准模式,用Razor Pages内置的RedirectToPage方法,自动适配路由:
// 省略添加收藏的业务逻辑 // 重定向到当前页,传递id参数,会自动触发OnGet方法重新加载产品数据 return RedirectToPage(new { id = ProductId });
2. 登录跳转支持回跳
重定向到登录页时携带当前页面地址作为returnUrl参数,ASP.NET Core默认的身份登录逻辑会自动识别该参数,登录完成后直接跳回当前商品页:
if (!User.Identity.IsAuthenticated) { var returnUrl = Url.Encode(Request.Path + Request.QueryString); return Redirect($"/login?returnUrl={returnUrl}"); }
3. 可选:不需要重定向的场景直接赋值返回页面
如果你不想走重定向,要直接在Post后渲染当前页面,手动给Product赋值即可避免空引用异常:
// 省略业务逻辑 Product = ProductService.Get(ProductId); return Page();
完整修正后的代码
页面后置代码
[BindProperty(SupportsGet = true)] public int ProductId { get; set; } public Product Product { get; set; } public void OnGet() { Product = ProductService.Get(ProductId); } public IActionResult OnPost() { if (!User.Identity.IsAuthenticated) { var returnUrl = Url.Encode(Request.Path + Request.QueryString); return Redirect($"/login?returnUrl={returnUrl}"); } // 执行添加到收藏夹的业务逻辑 ProductService.AddFavorite(User.Identity.Name, ProductId); // 重定向回当前产品页 return RedirectToPage(new { id = ProductId }); }
Razor页面代码无需修改,保持原有逻辑即可
内容的提问来源于stack exchange,提问作者Ali EXE
相关产品推荐
相关产品推荐

