MVC 4路由"查找"区域内的控制器

Pau*_*aul 2 c# asp.net-mvc asp.net-mvc-4

我有一个带有几个区域的MVC 4 WebSite ......我正在使用VS2012创建的所有默认路由...

所以,我可以访问(来自Area1):

Area1/ControllerX/ActionX
Run Code Online (Sandbox Code Playgroud)

我有一些没有区域的控制器,所以我可以访问:

ControllerY/ActionY
Run Code Online (Sandbox Code Playgroud)

一切都很好......但是,如果我尝试在没有Area1的情况下访问ControllerX,那样:

ControllerX/ActionX
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

Exception: The view 'ActionX' or its master was not found or no view engine supports the
searched locations. The following locations were searched: ~/Views/mangavagao/ActionX.cshtml 
~/Views/Shared/ActionX.cshtml 
Controller: ControllerX
Action: ActionX
Run Code Online (Sandbox Code Playgroud)

我期待一个Not Found 404错误...为什么要捕获该路由?

-

区域路线:

context.MapRoute(
            "Area1_default",
            "Area1/{controller}/{action}/{id}",
            new { controller = "ControllerX", action = "ActionY", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

默认路线:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "ControllerY", action = "ActionY", id = UrlParameter.Optional     );
Run Code Online (Sandbox Code Playgroud)

sha*_*kib 5

namespaces在默认的maproute函数中添加参数.然后将UseNamespaceFallbackdatatoken 设置为false.

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "MvcApplication.Controllers" }
    ).DataTokens["UseNamespaceFallback"] = false;
Run Code Online (Sandbox Code Playgroud)
  1. namespaces 当存在多个具有相同名称的控制器时,参数被设置为优先考虑控制器查找.

  2. 如果在命名空间中找不到匹配项,MVC仍将在此命名空间之外搜索控制器.

  3. UseNamespaceFallback datatoken告诉MVC忽略(2)语句.

希望这可以帮助.