MVC 用の ninject を使用してモジュラー フレームワークを作成しました。
各モジュールは独自のルートを登録でき、独自のビューを含みます。
モジュール ディレクトリ (dll の場所):
~/Modules/<module name>/
モジュール ビューは内部にあります。
<Module dir>/Views/
これらは、通常の mvc アプリとまったく同じように配置されます。つまり、各コントローラーのフォルダーと共有フォルダーです。
レイアウトを使用してビューをレンダリングしたいのですが、レイアウトの場所をコア フレームワークで設定する必要があります (テーマを変更できるようにするため)。
ビューがlayout = _layout.cshtml
あり、アプリを実行すると次のように返されます。
The layout page "_Layout.cshtml" could not be found at the following path: "~/Modules/Module2/Views/Home/_Layout.cshtml".
呼び出されたビューはここにありました~/Modules/Module2/Views/Home/Index.cshtml
。しかし、各ビューで設定せずに別の場所でレイアウトを探してほしい。とにかくコアフレームワークでそれを行うことができますか? 共有も参照するように MasterLocationFormats を設定しましたが、明らかにそうではありません (そこに _layout.cshtml を配置してテストしました)。
カスタム ビュー エンジン:
public NinjectRazorViewEngine(): base()
{
ViewLocationFormats = new[] {
"~/Modules/%1/Views/{1}/{0}.cshtml",
"~/Modules/%1/Views/{1}/{0}.vbhtml",
"~/Modules/%1/Views/Shared/{0}.cshtml",
"~/Modules/%1/Views/Shared/{0}.vbhtml"
};
MasterLocationFormats = new[] {
"~/Modules/%1/Views/{1}/{0}.cshtml",
"~/Modules/%1/Views/{1}/{0}.vbhtml",
"~/Modules/%1/Views/Shared/{0}.cshtml",
"~/Modules/%1/Views/Shared/{0}.vbhtml",
};
PartialViewLocationFormats = new[] {
"~/Modules/%1/Views/{1}/{0}.cshtml",
"~/Modules/%1/Views/{1}/{0}.vbhtml",
"~/Modules/%1/Views/Shared/{0}.cshtml",
"~/Modules/%1/Views/Shared/{0}.vbhtml"
};
PartialViewLocationFormats = ViewLocationFormats;
AreaPartialViewLocationFormats = AreaViewLocationFormats;
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
object moduleName;
if(controllerContext.RequestContext.RouteData.Values.TryGetValue("module",out moduleName))
return base.CreatePartialView(controllerContext, partialPath.Replace("%1", (string)moduleName));
return base.CreatePartialView(controllerContext, partialPath);
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
object moduleName;
if (controllerContext.RequestContext.RouteData.Values.TryGetValue("module", out moduleName))
return base.CreateView(controllerContext, viewPath.Replace("%1", (string)moduleName), masterPath.Replace("%1", (string)moduleName));
return base.CreateView(controllerContext, viewPath, masterPath);
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
object moduleName;
if (controllerContext.RequestContext.RouteData.Values.TryGetValue("module", out moduleName))
return base.FileExists(controllerContext, virtualPath.Replace("%1", (string)moduleName));
return base.FileExists(controllerContext, virtualPath);
}