使用AuthorizeRouteView时如何获取重定向前的原始目标页面
如何在Blazor中获取用户原访问页面并登录后重定向回去
你完全没必要用那种扒RouteAttribute的方式,其实有更简单、更可靠的方法——直接利用NavigationManager就能拿到用户当前试图访问的完整路径。
优化后的RedirectToLogin组件
直接修改你的RedirectToLogin类,用NavigationManager的内置方法获取原路径:
public class RedirectToLogin : ComponentBase { [Inject] protected NavigationManager NavigationManager { get; set; } protected override void OnInitialized() { // 把完整URL转换成相对应用基路径的相对地址,自动剔除域名等无关内容 string returnUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); // 将原路径作为参数拼接到登录地址中 string loginUrl = QueryHelpers.AddQueryString("/account/login", "redirect_url", returnUrl); NavigationManager.NavigateTo(loginUrl); } }
为什么你的原方法不够理想
你之前通过RouteData.PageType.GetCustomAttributes获取路由模板的方式存在几个明显缺陷:
- 只能拿到路由模板(比如
/product/{id}),但用户实际访问的是带具体参数的路径(比如/product/123),这种方式会丢失关键的路由参数 - 如果页面配置了多个
RouteAttribute,或者使用了约定式路由,这种解析方式会直接失效,通用性很差
登录完成后的重定向处理
登录成功后,只需要从登录页面的查询参数里取出redirect_url,再跳转回去即可:
// 登录逻辑执行完成后 var queryParams = QueryHelpers.ParseQuery(NavigationManager.Uri); if (queryParams.TryGetValue("redirect_url", out var redirectUrl) && !string.IsNullOrEmpty(redirectUrl)) { NavigationManager.NavigateTo(redirectUrl); } else { // 如果没有指定跳转地址,默认跳转到首页 NavigationManager.NavigateTo("/"); }
这样整个流程既可靠又简洁,完全不需要去手动解析路由属性~
内容的提问来源于stack exchange,提问作者kerry
相关产品推荐
相关产品推荐

