You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为.NET 7 Blazor WASM修改NavigationManager基础URL添加企业前缀

Blazor WASM 多企业URL前缀方案实现

修改NavigationManager.BaseUri的可行性

直接修改NavigationManager.BaseUri是可行的,登录成功后可以动态设置BaseUri为带企业前缀的地址,后续使用NavigateTo方法时会自动基于这个BaseUri生成完整URL。

实现代码

// 登录成功后执行(注入NavigationManager和本地存储服务)
var companyName = "target-company";
var baseUri = $"https://ggggg.com/{companyName}/";

navigationManager.BaseUri = baseUri;
// 更新当前页面Uri,确保状态一致
navigationManager.Uri = navigationManager.ToAbsoluteUri("").ToString();

// 将companyName存入本地存储,用于页面刷新后恢复
await localStorage.SetItemAsync("CurrentCompany", companyName);

注意事项

  • 页面刷新后BaseUri会重置为项目初始配置,因此需要在全局初始化逻辑(比如MainLayout.razor的OnInitializedAsync)中,从URL或本地存储读取companyName,重新设置BaseUri。
  • 该方法依赖NavigationManager的导航方法,直接手动拼接URL的场景需要额外处理。

更稳健的组合方案

如果希望完全避免手动拼接前缀,推荐结合自定义导航扩展、路由参数校验和全局URL拦截的方案,兼顾自动前缀和分享链接识别需求。

1. 自定义导航扩展方法

封装NavigateTo,自动从本地存储获取当前企业名称并拼接前缀:

public static class NavigationExtensions
{
    public static void NavigateToCompany(this NavigationManager navManager, string relativePath, bool forceLoad = false)
    {
        var currentCompany = navManager.GetCurrentCompany();
        var fullPath = $"/{currentCompany}/{relativePath.TrimStart('/')}";
        navManager.NavigateTo(fullPath, forceLoad);
    }

    public static string GetCurrentCompany(this NavigationManager navManager)
    {
        // 优先从本地存储取登录后的企业名称
        var localStorage = navManager.GetRequiredService<ILocalStorageService>();
        var company = localStorage.GetItem<string>("CurrentCompany");
        
        // 本地存储无数据时从URL解析
        if (string.IsNullOrEmpty(company))
        {
            var segments = navManager.Uri.Split('/').Where(s => !string.IsNullOrEmpty(s)).ToList();
            // 假设域名后第一个分段是企业名称(如ggggg.com/abc/products中的abc)
            if (segments.Count >= 2 && segments[0].Equals("ggggg.com", StringComparison.OrdinalIgnoreCase))
            {
                company = segments[1];
            }
        }
        
        return company ?? throw new InvalidOperationException("无法获取当前企业信息");
    }
}

使用时直接调用扩展方法:

// 跳转到产品页,自动拼接企业前缀
navManager.NavigateToCompany("products");

2. 页面路由配置

所有登录后的页面,通过@page指令定义带企业前缀的路由参数,确保URL格式符合要求:

@page "/{companyName}/products"
@inject NavigationManager NavManager

<h3>@companyName 的产品列表</h3>

@code {
    [Parameter]
    public string CompanyName { get; set; }

    protected override void OnInitialized()
    {
        // 校验URL中的企业名称是否与当前登录企业一致
        var currentCompany = NavManager.GetCurrentCompany();
        if (!CompanyName.Equals(currentCompany, StringComparison.OrdinalIgnoreCase))
        {
            NavManager.NavigateToCompany("products");
        }
    }
}

3. 分享链接自动识别登录

在App.razor中添加全局初始化逻辑,处理未登录时的分享链接解析:

@inject NavigationManager NavManager
@inject ILocalStorageService LocalStorage

<Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <PageTitle>Not found</PageTitle>
        <LayoutView Layout="@typeof(MainLayout)">
            <p role="alert">Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

@code {
    protected override async Task OnInitializedAsync()
    {
        var isLoggedIn = await LocalStorage.GetItemAsync<bool>("IsLoggedIn");
        if (!isLoggedIn)
        {
            var companyName = NavManager.GetCurrentCompany();
            if (!string.IsNullOrEmpty(companyName))
            {
                // 跳转到对应企业的登录页
                NavManager.NavigateTo($"/{companyName}");
            }
            else
            {
                // 跳转到企业选择页或默认登录页
                NavManager.NavigateTo("/select-company");
            }
        }
    }
}

方案总结

  • 若追求简单实现,直接修改NavigationManager.BaseUri即可满足自动前缀需求,但需处理页面刷新后的状态恢复。
  • 若需要更严谨的路由校验和分享链接处理,推荐使用自定义导航扩展+路由参数校验+全局拦截的组合方案,兼顾安全性和易用性。

内容的提问来源于stack exchange,提问作者Sonny Hansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:05:38