MVC 4 - 路由到非区域控制器的问题
MVC 4 - issue with routing to non-area controllers
我有一个项目正在从 MVC 2 -> MVC 4 升级。在从 MVC 2 -> MVC 3 的转换过程中,我注意到我的一些超链接断开了并且不再匹配之前定义的路由.我有以下项目结构:
...
App_Data
Areas
Test
Controllers
TestController
Views
Models
Controllers
PartialController
Views
Scripts
...
生成的链接格式为/Test/Partial/Render
。如果我返回 运行 迁移前的项目,PartialController
Render
操作会按预期命中。但是,现在该应用程序说找不到操作,因为没有 Test/Partial
控制器。我实际上不确定它之前是如何工作的,但似乎无法正确映射它。
有什么我想念的吗?这是相关代码:
Global.asax.cs:
...
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
...
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = "" }
);
TestAreaRegistration.cs:
context.MapRoute(
"Test_default",
"Test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
我确实将 Controllers 文件夹上移了一个级别,以便更符合项目的结构;之前它位于 Areas 文件夹中。但是,none 在我移动它之前就起作用了,所以我怀疑情况是否如此。我还认为 Autofac 与此有关,但我不太确定,因为如果我将 "Test" 部分从 URL 中剔除,它会按预期匹配。
我想这一切都归结为一个问题,即如何在匹配到特定区域的控制器目录之前首先检查 "generic" 控制器目录,即使在 URL.
在此先感谢您的帮助!
编辑: 如果有帮助,我注意到在现有的 MVC 2 解决方案中,例如,如果我转到 Test/Home
,它将调用 Index
HomeController
的方法。但是,这不会在新解决方案中发生。这是因为没有与新路线关联的视图吗?我还没有为每个相应的 .ascx 文件制作新的 .cshtml 文件,但我认为这不重要,因为它们在其他地方被使用。
很明显这个问题与命名空间有关。我曾在此类问题上看到过该答案,但这些问题与寻找观点的碰撞有关。这是我最终添加到我的每个区域注册中的行:
context.MapRoute(
"Test_default",
"Test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new string[] { "Project.Web.Controllers", "Project.Web.Areas.Test.Controllers" } //added this line
);
我有一个项目正在从 MVC 2 -> MVC 4 升级。在从 MVC 2 -> MVC 3 的转换过程中,我注意到我的一些超链接断开了并且不再匹配之前定义的路由.我有以下项目结构:
...
App_Data
Areas
Test
Controllers
TestController
Views
Models
Controllers
PartialController
Views
Scripts
...
生成的链接格式为/Test/Partial/Render
。如果我返回 运行 迁移前的项目,PartialController
Render
操作会按预期命中。但是,现在该应用程序说找不到操作,因为没有 Test/Partial
控制器。我实际上不确定它之前是如何工作的,但似乎无法正确映射它。
有什么我想念的吗?这是相关代码:
Global.asax.cs:
...
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
...
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = "" }
);
TestAreaRegistration.cs:
context.MapRoute(
"Test_default",
"Test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
我确实将 Controllers 文件夹上移了一个级别,以便更符合项目的结构;之前它位于 Areas 文件夹中。但是,none 在我移动它之前就起作用了,所以我怀疑情况是否如此。我还认为 Autofac 与此有关,但我不太确定,因为如果我将 "Test" 部分从 URL 中剔除,它会按预期匹配。
我想这一切都归结为一个问题,即如何在匹配到特定区域的控制器目录之前首先检查 "generic" 控制器目录,即使在 URL.
在此先感谢您的帮助!
编辑: 如果有帮助,我注意到在现有的 MVC 2 解决方案中,例如,如果我转到 Test/Home
,它将调用 Index
HomeController
的方法。但是,这不会在新解决方案中发生。这是因为没有与新路线关联的视图吗?我还没有为每个相应的 .ascx 文件制作新的 .cshtml 文件,但我认为这不重要,因为它们在其他地方被使用。
很明显这个问题与命名空间有关。我曾在此类问题上看到过该答案,但这些问题与寻找观点的碰撞有关。这是我最终添加到我的每个区域注册中的行:
context.MapRoute(
"Test_default",
"Test/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new string[] { "Project.Web.Controllers", "Project.Web.Areas.Test.Controllers" } //added this line
);