ASP.NET Core 2.2 MVC:区域内登录页设默认页遇404问题
嘿,我帮你梳理下这个404问题的根源,主要是路由配置顺序、区域标识缺失,还有属性路由与传统路由的冲突导致的,咱们一步步来解决:
问题根源拆解
- 路由顺序搞反了:ASP.NET Core的路由是按注册顺序匹配的,你先注册了
default路由,后注册区域路由,但区域路由的优先级应该更高,否则会导致区域内的控制器匹配失败。 - 属性路由和传统路由冲突:你的
AccountController同时用了[Route]属性路由和Startup里的传统路由,两种路由机制不能混用在同一个控制器上,这会让路由系统搞不清该用哪套规则匹配请求。 - 默认路由没指定区域:你写的默认路由模板里有
identity前缀,但没有明确指定area参数,路由系统无法识别这是Identity区域下的控制器。
解决方案(两种可选方案)
方案一:改用纯传统路由(推荐,更符合MVC区域路由的规范)
第一步:移除控制器上的属性路由
把AccountController里的[Route]特性全部删掉,因为我们要改用传统路由规则:
[Area("Identity")] // 删掉这行:[Route("identity/[controller]")] public class AccountController : BaseController { private readonly UserManager<ApplicationUser> _userManager; private readonly SignInManager<ApplicationUser> _signInManager; public AccountController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager ) { _userManager = userManager; _signInManager = signInManager; } // GET: /Account/SignIn // 删掉这行:[Route("[action]")] [HttpGet] [AllowAnonymous] public async Task<IActionResult> SignIn(string returnUrl = null) { return View(); } }
第二步:调整Startup的路由顺序和配置
先注册区域路由(让区域路由优先匹配),再把默认路由直接映射到Identity区域的Account/SignIn:
app.UseMvc(routes => { // 先注册区域路由,确保区域内的控制器能被正确匹配 routes.MapRoute( name: "areaRoute", template: "{area:exists}/{controller=Account}/{action=SignIn}/{id?}"); // 根路径直接指向Identity区域的登录页 routes.MapRoute( name: "default", template: "", defaults: new { area = "Identity", controller = "Account", action = "SignIn" }); });
方案二:保留属性路由(适合习惯用属性路由的场景)
如果你想继续用属性路由,只需要给SignIn方法加一个根路径的路由匹配规则,让/能直接命中这个Action:
[Area("Identity")] [Route("identity/[controller]")] public class AccountController : BaseController { private readonly UserManager<ApplicationUser> _userManager; private readonly SignInManager<ApplicationUser> _signInManager; public AccountController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager ) { _userManager = userManager; _signInManager = signInManager; } // 增加[Route("/")],让根路径直接匹配这个登录方法 [Route("/")] [Route("[action]")] [HttpGet] [AllowAnonymous] public async Task<IActionResult> SignIn(string returnUrl = null) { return View(); } }
然后Startup的路由配置可以简化,因为属性路由的优先级高于传统路由:
app.UseMvc(routes => { routes.MapRoute( name: "areaRoute", template: "{area:exists}/{controller}/{action}/{id?}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
测试验证
启动项目后访问根路径/,应该就能直接跳转到Identity区域的SignIn登录页,不会再出现404错误了。
内容的提问来源于stack exchange,提问作者Nilesh Gajare
相关产品推荐
相关产品推荐

