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

如何在URL中隐藏Area名称?ASP.NET Core区域路由问题

解决区域内链接路径自动切换的问题

我来帮你搞定这个链接路径的问题!根据你的描述,核心问题是共享布局里的标签助手不知道当前是否处于Admin区域,所以没法自动生成带/admin前缀的路径。下面是几个可行的解决方案:

1. 在Admin区域的_ViewStart中设置区域标识

这是最简洁的方法,因为你的Admin区域所有页面都共用这个_ViewStart,只需要加一行代码就能让所有页面的链接自动识别区域:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    // 告诉标签助手当前处于Admin区域
    ViewData["Area"] = "Admin";
}

这样,当你在Admin区域的页面里渲染布局时,<a asp-controller="Blog" asp-action="Index">就会自动生成/admin/blog的路径;而在非Admin区域的页面,因为没有设置ViewData["Area"],就会生成/blog。

2. 直接在链接标签中动态指定区域

如果你想更灵活控制,也可以通过ViewData动态设置asp-area属性:

<a asp-area="@ViewData["Area"]" asp-controller="Blog" asp-action="Index" class="nav-link"> Blog </a>

这种方式的好处是,不管在哪个区域,只要ViewData里有Area值,就会自动带上前缀;没有的话就生成根路径链接,完美适配两种场景。

3. 确保Admin区域的路由配置正确

别忘记检查你的区域路由是否配置到位,这是链接生成的基础:

ASP.NET Core 端点路由(Program.cs)

// 先注册Admin区域路由
app.MapAreaControllerRoute(
    name: "Admin_default",
    areaName: "Admin",
    pattern: "Admin/{controller=Home}/{action=Index}/{id?}"
);

// 再注册根路由(非区域)
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"
);

传统区域注册(AdminAreaRegistration.cs)

如果是用旧的区域注册方式,确保AdminAreaRegistration.cs的代码正确:

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName => "Admin";

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

4. 确认Blog控制器的位置

如果你希望Admin区域的链接指向Admin专属的Blog控制器,记得在Areas/Admin/Controllers目录下创建BlogController.cs;如果只是想在Admin区域里访问根目录的Blog控制器,但路径带/admin,那路由配置正确的情况下,上面的方法也能生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:17