我正在开发一个应该支持模块的mvc3项目。例如,我有一个MVP3核心项目和一个MVC3模块项目(MyModule)。
现在,我希望在核心项目中加载并显示来自MVC3模块项目的视图。我写了一个自定义的VirtualPathProvider类和一个VirtualFile类,它从核心项目之外的其他位置获取视图。
不知怎么的,我得到了以下错误:CS0103: The name 'ViewBag' does not exist in the current context.
我正在做的是使用核心项目中AssemblyInfo类中的以下代码行从核心项目中的模块项目加载程序集:
[assembly: PreApplicationStartMethod(typeof(ModuleLoader), "Init")]
ModuleLoader类获取DLL并使用BuildManager.AddReferencedAssembly
添加程序集。
现在,我可以通过导航到http://localhost/MyModule
来调用MyModuleController.cs中的操作方法。在MyModuleController.cs的Index ActionResult方法中,我返回如下视图:
return View("~/Modules/MyModule/Index.cshtml");
VirtualPathProvider检查路径是否以~/Modules/开头,并从模块项目中获取视图(MyModule->Views->Index.cshtml)。
现在,我已经搜索了错误,并了解到缺少Web.config文件,但模块项目中包含了所有内容,因为它是一个完整的MVC3 Web项目。
我读了很多关于从程序集中加载嵌入视图的文章,但我上面描述的内容可能吗?
提前感谢!
编辑:
决定走Griffin-MvcContrib的路,使用它的插件系统,它似乎提供了我需要的一切,最重要的是,它使用了Autofac,我已经决定为IOC使用它!
Griffin.MvcContrib-插件系统
使用自定义VirtualPathProvider
并添加对BuildManager
的引用只是解决方案的一部分。您还需要修改视图,并为DLL中的每个视图指定要使用的布局。
接下来,您还必须使用@inherits
而不是@model
视图。
或者你可以简单地使用Griffin.MvcContrib,它可以为你处理一切:http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/