ASP.NET MVC中Areas的namespaces和UseNamespaceFallback

今天用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 }
原文地址:https://www.cnblogs.com/yipu/p/2780119.html