我已经使自己成为一个模块化框架与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