2012-10-28 59 views
5

我有一個網站與「一般」路線結構,和一個額外的「翻譯」區域。因此,在頂層,你有這樣的:ASP.NET MVC路由 - 所有看起來匹配正確的路由模板,但不工作

  • /
  • /關於( 「通用」)
  • /翻譯(區)

內轉換區,我有:

  • /轉換/字(WordController,索引操作)
  • /轉換/字/添加(WordControll呃,添加動作)
  • /轉換/字/改善(WordController,提高動作)

所有這些工作。

然而,只要我添加一個進一步的控制器到現有的結構,例如。定義...

  • /轉換/定義(DefinitionController,索引操作)
  • /轉換/清晰度/添加(DefinitionController,添加動作)

或發音......

  • /Translate/Pronunciation(PronunciationController,Index action)
  • /Translate/Pronunciation/Add(PronunciationController,Add acti上)

我得到的是一個404

我區的路由配置低於:

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Translate_direct", 
      "Translate/{controller}/{action}", 
      new { action = "Index", controller = "Default", } 
     ); 
     context.MapRoute(
      "Translate_default", 
      "Translate/{toLanguageCode}/{query}/{fromLanguageCode}/{controller}/{section}/{action}/{id}", 
      new { action = "Index", controller="Default", id = UrlParameter.Optional, section=UrlParameter.Optional } 
     ); 
    } 

我已經安裝了Phil Haack's RouteDebugger並得到了以下結果:

Screenshot

因此,它似乎與控制器和操作相匹配,但我只是得到404.

的完整性和保證,也顯示我的「MVC」文件結構:

enter image description here

我清楚地失去了一些東西很明顯,但不知道是什麼...?


更新:

看來我的命名空間在某種程度上參與。

我的TranslateAreaRegistration類具有名稱空間Taggloo.Web.Client.Areas。Translate但我的PronunciationController有一個* Taggloo.Web。** Mvc的命名空間。** Client.Areas.Translate.Controllers *

看來我的命名空間中導致二者不同的錯誤(TranslateAreRegistration類應該在Taggloo.Web.Mvc.Client.Areas.Translate命名空間中)也是問題所在。我試圖讓他們都Taggloo.Web.Mvc ....但這沒有奏效。我勉強地設置爲Taggloo.Web.Client ...而不是現在它的工作原理。

所以不是一個解決方案,一個解決方法,儘管環顧四周,我仍然不明白爲什麼。

+2

您好, 所有你想要的是在所有的控制器中有相同的命名空間。 我的兩個控制器分別位於不同的文件夾中,即Log和Error。 似乎都與我一起工作 例如, '代碼 命名空間Web.Controllers { 公共類LogController:控制器 {} } 命名空間Web.Controllers { 公共類ErrorController:控制器 {} } ' 阿 –

+0

,由於@NipunAmbastha 。似乎我錯過了我的一個控制器。 –

+0

很高興,我可以幫你:) –

回答

1

MVC(System.Web.Mcv.AreaRegistration.RegisterAllAreas)中的默認區域註冊使用Area的AreaRegistration派生類的名稱空間將名稱空間數據標記添加到路由定義(如果使用AreaRegistrationContext.MapRoute重載之一。

如果此名稱空間標記已定義,則DefaultControllerFactory會在匹配路由時交叉檢查控制器的名稱空間。

如果控制器的名稱空間相同(或者如果名稱空間令牌以。*結尾),則工廠將匹配控制器類型並繼續實例化控制器。如果它不匹配,並且ControllerFactory從GetControllerType方法返回null,並且最終會得到一個404.

您提到您將兩個都設置爲Taggloo.Web.Mvc ....如果它們是相同的,它應該已經工作。

+0

是的,我想到了這個問題。謝謝。 MVC中的「幕後」有很多事情,我有時會懷疑M是否代表「Magic」。你必須知道約定(超出配置)和背後的原因。 –