2011-11-10 21 views
0

私は自分のプロジェクトに各エリアを移動することで自分のASP.NET MVCアプリケーションをモラール化しようとしています。私がAreaRegistrationのものをリファクタリングし、自分のアプローチを使用することに決めたまで、すべてうまくいっていました(この方法で私のモジュール内のフィルタと依存関係を登録することもできます)。リフレクターを使って私は以下を考え出しました。個々のプロジェクトのASP.NET MVCエリア - リファクタリングAreaRegistration Stuff

まず私は、各モジュール/地域については、以下のインタフェースを実装しています

public interface IModule { 
    string ModuleName { get; } 
    void Initialize(RouteCollection routes); 
} 

例:

public class BlogsModule : IModule { 
    public string ModuleName { get { return "Blogs"; } } 

    public void Initialize(RouteCollection routes) { 
     routes.MapRoute(
      "Blogs_Default", 
      "Blogs/{controller}/{action}/{id}", 
      new { area = ModuleName, controller = "Home", action = "Index", 
       id = UrlParameter.Optional }, 
      new string[] { "Modules.Blogs.Controllers" } 
     ); 
    } 
} 

その後、私のGlobal.asaxファイル(のApplication_Startイベント)で、私は言う:

// Loop over the modules 
foreach (var file in Directory.GetFiles(Server.MapPath("~/bin"), "Modules.*.dll")) { 
    foreach (var type in Assembly.LoadFrom(file).GetExportedTypes()) { 
     if (typeof(IModule).IsAssignableFrom(type)) { 
      var module = (IModule)Activator.CreateInstance(type); 
      module.Initialize(RouteTable.Routes); 
     } 
    } 
} 

その後、私は既存のAreaRegistrationのものを削除しました。この時点まではすべてがうまくいっています。私は例えば、私のアプリケーションを実行し、モジュールへのリンクをレンダリングする場合:

@Html.ActionLink("Blogs", "Index", "Home", new { area = "Blogs" }, null) 

正しいURLが表示されますが、私は、URLをクリックしたとき、それは間違ったビューが表示されます。デバッグ後、URLがBlogsモジュールのHomeController内の正しいActionにルーティングされるように見えます。ただし、Home/Index.cshtmlビューはメインプロジェクトに表示され、モジュール/エリアには表示されません。私はAreaViewLocationFormats(RazorViewEngineの内部)を無視しているように見えるので、ルーティングエンジンのURLを領域として扱うように指示する方法を見逃していました。

誰かが私に何か不足していることを示すことができたら、私はそれを感謝します。ありがとう

答えて

0

さらにリファクタリングした後、ビューエンジンはエリアデータトークンを探します。したがって、モジュールの初期化メソッドでルートを追加するようにコードを変更しました。

// Create the route 
var route = new Route("Blogs/{controller}/{action}/{id}", new RouteValueDictionary(new { area = ModuleName, controller = "Home", action = "Index", id = UrlParameter.Optional }), new MvcRouteHandler()); 

// Add the data tokens 
route.DataTokens = new RouteValueDictionary(); 
route.DataTokens["area"] = this.ModuleName; 
route.DataTokens["UseNamespaceFallback"] = false; 
route.DataTokens["Namespaces"] = new string[] { "Modules.Blogs.Controllers" }; 

// Add the route 
routes.Add(route); 

希望します。