2013-10-08 63 views
2

我有一個MVC 4的網站幾個方面......使用I'm由VS2012創建的所有默認路由裏面......MVC 4路由「發現」控制器的區域

所以,我可以訪問(從區域1 ):

Area1/ControllerX/ActionX 

我有沒有一些區域控制器,這樣我就可以訪問:

ControllerY/ActionY 

一切都很好......但是,如果我嘗試訪問ControllerX無區域1,這樣的:

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 

我期待一個未找到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 ); 
+0

因此'ControllerX'駐留在'Area1'中,但'ControllerY'只是一個標準控制器,對嗎? –

+0

是的,ControllerY沒有區域。 – Paul

回答

5

添加namespaces參數默認圖路線功能。然後將UseNamespaceFallback datatoken設置爲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. UseNamespaceFallback datatoken告訴MVC無視(2)語句。

希望這會有所幫助。

+0

謝謝,工作得很好! – Paul

+0

不客氣。很高興它有幫助。 :) – shakib

0

嘗試將區域路線與命名空間映射:

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

變化AppAreaName爲相應的值。

+0

在兩個相同的行爲中添加了命名空間! – Paul

+0

當你在沒有'Area1'的情況下調用它時,在'ControllerX'中的'ActionX'中有沒有斷點? –

+0

是的......我不明白它爲什麼會出現在那裏...... – Paul

0

這類似於這樣的問題:Not including area name in URL results in "The view 'Index' or its master was not found" instead of 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 
); 
+0

我嘗試了命名空間在兩個和沒有改變......試圖把只在默認路由,沒有改變以及... – Paul