我已經使自己成爲一個模塊化框架與ninject爲MVC。佈局在模塊化的MVC應用程序
每個模塊都可以註冊自己的路線幷包含它自己的視圖。
模塊DIR(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);
}
如何模塊來實現的?它們是作爲MVC領域實現的嗎? –
他們本質上是註冊控制器和其他任何內核ninject模塊。自定義控制器工廠通過內核查找控制器。每個模塊都在一個單獨的程序集中。 – MrJD
你解決了嗎?我目前遇到同樣的問題。 – ngm