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
相关产品推荐
相关产品推荐

