2013-07-04 14 views
5

わかりやすい作業のように見せている - 私のプロジェクトの別のアセンブリからコントローラを呼び出す。ASP.Net MVC 4.コントローラを別のアセンブリにルーティングするとエラー404が返される

しかし、私がそのコントローラから情報を要求すると、エラー404が発生します。私は過去5〜6時間それと戦っています。私は小さくて明白なものを見逃しているかもしれないと思っています。助言のために。

ルーティングとエラー404に関するstakoverflow同様の質問がありましたが、このようなエラーが発生せず、同様のコード構造を使用した別のプロトタイププロジェクトを実装したとき、私はその問題が私のものとは異なると考えています。

私が達成したいことの全体的な目標は、hereのように独立したプロジェクトの中に領域を実装することです。 小さなプロトタイプのリンクで説明されているように(そして完璧に動作する)、今実際のプロジェクトに応募しようとしているようなことはすべてやった。

これは私がアセンブリを含むとルートを管理する方法である:

  1. 隠された子プロジェクトを代表する分野の一つとの主なプロジェクトがあり、「CommunicationBus」
  2. 「CommunicationBus」プロジェクトは、クラスが含まれています"CommunicationBusAreaRegistration"。ルートを登録すると正しく動作します。私はここでデバッガを使うことができます。また、私はroutedebuggerを使ってこのルートを見ることができます(下記スクリーンショット参照)。私もこのクラスのネームスペースで演奏し、最後に.Areas.CommunicationBusを追加しようとしましたが、気づいたことはありませんでした。私はルートに以下の方法を登録し、メインプロジェクトのGlobal.asaxので

    namespace MBVD.MainProject.UI 
    { 
        public class CommunicationBusAreaRegistration : AreaRegistration 
        { 
         public override string AreaName 
         { 
          get 
          { 
           return "CommunicationBus"; 
          } 
         } 
    
         public override void RegisterArea(AreaRegistrationContext context) 
         { 
          context.MapRoute(
           "CommunicationBus_default", 
           "CommunicationBus/{controller}/{action}/{id}", 
           new { action = "Index", id = UrlParameter.Optional }, 
           new string[] { "CommunicationBus.Controllers" } 
          ); 
         } 
        } 
    } 
    
  3. public static void RegisterRoutes(RouteCollection routes) 
    { 
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    
        routes.MapRoute(
         "Default", // Route name 
         "{controller}/{action}/{id}", 
         new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
         new[] { "MBVD.MainProject.UI.Controllers" } 
        ); 
    } 
    

    私は「CommunicationBus.Controllers」ここで参照した場合、私はもはやメインの開いているページをすることができません応用。しかし、私はここでメインアプリケーションのコントローラへのパスのみを登録する必要があると信じます。

  4. メインプロジェクトのbinフォルダに出力パスが設定されています。私がCommunicationBusをビルドするたびに、私はメインプロジェクトに新しく.dllを取得します。私がメインプロジェクト

    @Html.ActionLink("test","Index","Test", new {Area="CommunicationBus"}, null) 
    

    へのリンクを追加しました

    namespace CommunicationBus.Controllers 
    { 
        public class TestController : Controller 
        { 
         [HttpGet] 
         public string Index() 
         { 
          return "It works!"; 
         } 
        } 
    } 
    
  5. 私はCommunicationBusプロジェクトにシンプルなコントローラを追加

    はlocalhost:63254/CommunicationBus /テスト

  6. 私は私は両方のプロジェクトのためのASP.NET MVC 4を使用

routedebugger

:それは疑わしい何も表示されませんroutedebuggerと。

私はこのエラーが発生する理由を理解するために何ができるのかを知りたいと思います。

答えて

0

ルーティングの順序が間違っていると思われます。 /CommunicationBus/Test/{controller}/{action}/{id}/CommunicationBus/{controller}/{action}/{id}の両方に一致するため、最初の登録済みルート(/{controller}/{action}/{id})が目的のルートよりも優先され、MVCはCommunicationBusというデフォルト名前空間(MBVD.MainProject.UI.Controllers)のコントローラを見つけることができません。

デフォルトルートの前にエリアルートを登録してみてください。または、そのビジネスを一括してスキップし、属性ルーティング(http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx)を使用することもできます。アトリビュートルーティングを使用する場合は、routes.MapMvcAttributeRoutes();を呼び出す前にすべてのネームスペースからコントローラをロードする必要があります(参照として登録するだけであれば問題ありません。参照を動的にロードする場合にのみ問題になります) 。

関連する問題