AspNet Core MVC Area路由未按预期工作,URL生成异常求助
问题分析与解决
首先,你的路由配置顺序搞反了!ASP.NET Core的路由匹配是按注册顺序优先匹配的,你先注册了默认的default路由,再注册Area路由,导致路由系统先尝试用默认路由模板来生成URL——但默认路由里没有area参数,所以它就把area=Admin当成查询字符串拼到URL后面了,而不是用Area的路由模板。
解决步骤:
1. 调整路由注册顺序
把MapAreaControllerRoute移到MapControllerRoute前面,因为Area路由是更具体的路由规则,应该让它先被匹配。修改后的Configure方法代码如下:
app.UseEndpoints(endpoints => { // 先注册Area路由 endpoints.MapAreaControllerRoute( name: "areas", areaName: "Admin", pattern: "{area}/{controller=Home}/{action=Index}/{id?}" ); // 再注册默认路由 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); });
2. 确认控制器已标记Area特性
另外,别忘了你的Admin Area下的Home控制器,必须加上[Area("Admin")]特性,否则路由系统无法识别它属于Admin Area:
[Area("Admin")] public class HomeController : Controller { public IActionResult Index() { return View(); } }
为什么这样改?
路由系统在生成URL时,会按你注册路由的顺序依次尝试匹配路由模板。当你把Area路由放在前面,它会先匹配到包含{area}参数的模板,这样就能正确生成https://localhost:44321/Admin/Home/Index这样的URL,而不是把area作为查询参数。
如果还是有问题,可以检查一下你的Area目录结构是否正确:应该是Areas/Admin/Controllers/HomeController.cs,对应的视图在Areas/Admin/Views/Home/Index.cshtml,目录结构不对也会导致路由异常哦。
内容的提问来源于stack exchange,提问作者Haseeb Khan
相关产品推荐
相关产品推荐

