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

ASP.NET MVC项目路由与目录问题求助:Identity文件夹下页面跳转异常

ASP.NET MVC 路由与区域视图定位问题解决方案

问题背景

  • 访问Admin控制器的Index等页面时出现「页面未找到」错误,核心原因是视图未按区域规范放置在Areas目录中,且路由配置未正确绑定区域路径
  • 已在Program.cs中配置默认路由与Admin路由,但从Identity区域页面跳转至Admin页面或主页时仍存在访问异常

当前配置代码

Program.cs 路由配置

// Default routes
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

// Admin routes
app.MapControllerRoute(
    name: "admin",
    pattern: "{controller=Admin}/{action=Index}/{id?}");

布局页(_Layout.cshtml) 导航片段

<header>
    <h3>Online Mart</h3>

    @if (SignInManager.IsSignedIn(User))
    {
        if (User.IsInRole("admin"))
        {
            <nav class="nav-bar">
                <a asp-controller="Admin" asp-action="Index">Dashboard</a>
                <a asp-controller="Product" asp-action="Index">Products</a>
                <a asp-controller="Category" asp-action="Index">Categories</a>
                <a asp-controller="Orders" asp-action="Index">Orders</a>
                <a asp-controller="Customers" asp-action="Index">Customers</a>
            </nav>
        }
        else
        {
            <nav class="nav-bar">
                <a asp-controller="Home" asp-action="Index">Home</a>
                <a asp-controller="Shop" asp-action="Index">Shop</a>
                <a asp-controller="Cart" asp-action="Index">Cart</a>
                <a asp-controller="Orders" asp-action="Index">Orders</a>
                <a asp-controller="Home" asp-action="Aboutus">About</a>
            </nav>
        }
    }
    else
    {
        <nav class="nav-bar">
            <a asp-area="" asp-controller="Home" asp-action="Index">Home</a>
            <a asp-controller="Shop" asp-action="Index">Shop</a>
            <a asp-controller="Cart" asp-action="Index">Cart</a>
            <a asp-controller="Orders" asp-action="Index">Orders</a>
            <a asp-controller="Home" asp-action="Aboutus">About</a>
        </nav>
    }

    <partial name="_LoginPartial" />
</header>

_LoginPartial.cshtml 代码

@inject SignInManager<AppUser> SignInManager
@inject UserManager<AppUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
        if (User.IsInRole("admin"))
        {
            <li class="nav-item dropdown nav-bar">
                <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="true">Admin</a>

                <ul class="dropdown-menu">
                    <li>
                        <a class="dropdown-item text-dark" asp-area="Identity" asp-controller="Account" asp-action="Manage">Profile</a>
                    </li>
                    <li><hr class="dropdown-divider" /></li>
                    <li>
                        <a class="dropdown-item text-dark" asp-area="Identity" asp-controller="Account" asp-action="Logout">Logout</a>
                    </li>
                </ul>
            </li>
        }
        else
        {
            <li class="nav-item dropdown nav-bar">
                <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="true">User</a>

                <ul class="dropdown-menu">
                    <li>
                        <a class="dropdown-item text-dark" asp-area="Identity" asp-controller="Account" asp-action="Manage">Profile</a>
                    </li>
                    <li><hr class="dropdown-divider" /></li>
                    <li>
                        <a class="dropdown-item text-dark" asp-area="Identity" asp-controller="Account" asp-action="Logout">Logout</a>
                    </li>
                </ul>
            </li>
        }
    }
    else
    {
        <div class="nav-bar">
            <a id="register" asp-area="Identity" asp-controller="Account" asp-action="Register">Register</a>
            <a id="login" asp-area="Identity" asp-controller="Account" asp-action="Login">Login</a>
        </div>
    }
</ul>

分步解决方案

1. 规范Admin区域的目录结构

必须按照ASP.NET MVC区域规范创建目录,确保视图与控制器的区域绑定:

Areas/
└── Admin/
    ├── Controllers/
    │   └── AdminController.cs
    ├── Views/
    │   ├── Admin/
    │   │   └── Index.cshtml
    │   ├── Product/
    │   │   └── Index.cshtml
    │   ├── Shared/
    │   └── _ViewStart.cshtml

2. 修正Program.cs中的路由配置

区域路由必须优先于默认路由,且明确指定区域约束,避免路由匹配冲突:

// Admin区域路由 - 放在默认路由之前,确保优先匹配
app.MapControllerRoute(
    name: "admin",
    pattern: "Admin/{controller=Admin}/{action=Index}/{id?}",
    defaults: new { area = "Admin" });

// 默认路由(无区域)
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}",
    defaults: new { area = "" });

3. 修正视图中的跳转链接(指定区域属性)

所有跨区域跳转必须明确指定asp-area属性,避免继承当前区域上下文:

  • Admin区域链接:添加asp-area="Admin"
    <a asp-area="Admin" asp-controller="Admin" asp-action="Index">Dashboard</a>
    <a asp-area="Admin" asp-controller="Product" asp-action="Index">Products</a>
    <!-- 其他Admin相关链接同理 -->
    
  • 非区域链接(如Home、Shop):添加asp-area=""(空字符串),确保从Identity区域跳转时不会错误匹配到Identity内的控制器
    <a asp-area="" asp-controller="Home" asp-action="Index">Home</a>
    <a asp-area="" asp-controller="Shop" asp-action="Index">Shop</a>
    

4. 验证Identity区域跳转逻辑

_LoginPartial中跳转至Identity区域的链接已正确使用asp-area="Identity",无需修改;但从Identity页面跳转至其他区域时,必须按上述规则指定asp-area属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:05:55