私は自分のプロジェクトに各エリアを移動することで自分の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を領域として扱うように指示する方法を見逃していました。
誰かが私に何か不足していることを示すことができたら、私はそれを感謝します。ありがとう