2

我有一个包含多个区域的 MVC 4 网站...我正在使用 VS2012 创建的所有默认路由...

所以,我可以访问(从Area1):

Area1/ControllerX/ActionX

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

ControllerY/ActionY

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

ControllerX/ActionX

我得到了那个错误:

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

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

--

区域路线:

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

默认路由:

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

3 回答 3

5

namespaces在默认的 maproute 函数中添加参数。然后将UseNamespaceFallback数据令牌设置为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;
  1. namespaces当存在多个同名控制器时,参数设置为优先查找控制器。

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

  3. UseNamespaceFallbackdatatoken 告诉 MVC 忽略 (2) 语句。

希望这可以帮助。

于 2013-10-08T21:20:17.653 回答
0

尝试使用命名空间映射区域路线:

context.MapRoute(
            "Area1_default",
            "Area1/{controller}/{action}/{id}",
            new { controller = "ControllerX", action = "ActionY", id = UrlParameter.Optional },
            new[] { "App.Areas.AreaName.Controllers" }
);

App将和更改AreaName为相应的值。

于 2013-10-08T19:53:54.683 回答
0

这类似于这个问题:Not include area name in URL results in "The view 'Index' or its master was not found" 而不是 404

在您的情况下,需要将命名空间添加到默认路由,而不是区域路由。在这种情况下,命名空间不应引用区域控制器。像这样的东西应该工作:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    null, // object constraints
    new string[] { "Namespace.Application.Controllers" } // namespaces
);
于 2013-10-08T20:19:43.960 回答