今天用ASP.NET MVC的时候,测试Areas区域发现一个问题,例如:
Areas - Apps -Controllers - DemoController.cs
-Views - Demo - Index.cshtml
Controllers – 无
Views – 无
此时进行路由测试,却意外发现:
http://localhost/Apps/Demo 这个URL正常访问没问题
http://localhost/Demo 却不是找不到页面,而是会执行DemoController到但报错找不到Index.cshtml这个View
可见如果根目录下的Controller中没有DemoController的时候
http://localhost/Demo竟然也会被路由到Areas -> Apps -> Controllers文件夹下的DemoController
这样的URL路由规则明显是不够严谨的!这并不是预期设计的结果!
后来爬到文章,发现如果在当前的命名空间找不到Controller,MVC会自动去搜寻别的Controller,晕倒,
所以必须在MapRoute时加上参数namespaces和属性DataTokens["UseNamespaceFallback"] = false;
代码如下(标红),这样,MVC才会锁定在指定的NameSpace下寻找,经测试后正常。
示例文件:RouteConfig.cs
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default", 7 url: "{controller}/{action}/{id}", 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 9 namespaces: new string[] { "MvcTest.Controllers" } 10 ).DataTokens["UseNamespaceFallback"] = false; 11 }
示例文件:AppAreaRegistration.cs
1 public override void RegisterArea(AreaRegistrationContext context) 2 { 3 context.MapRoute( 4 "Apps_default", 5 "Apps/{controller}/{action}/{id}", 6 new { action = "Index", id = UrlParameter.Optional }, 7 new string[] { "MvcTest.Areas.Apps.Controllers" } 8 ).DataTokens["UseNamespaceFallback"] = false; 9 }