从其他项目加载非嵌入式视图

时间:2012-08-28 20:27:41

标签: asp.net-mvc-3 views virtualpathprovider griffin.mvccontrib

我正在开发一个应该支持模块的mvc3项目。例如,我有一个MVC3核心项目和一个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方法中,我返回View,如下所示:

return View("~/Modules/MyModule/Index.cshtml");

VirtualPathProvider检查路径是否以〜/ Modules /开头,并从模块项目中获取视图(MyModule - > Views - > Index.cshtml)。

现在我已经搜索了错误,并且我读到了缺少Web.config文件的内容,但我在模块项目中拥有所有内容,因为它是一个完整的MVC3 Web项目。

我读了很多关于从程序集中加载嵌入式视图的内容,但我上面描述的内容是否可能?

提前致谢!

修改

决定采用Griffin-MvcContrib方式并使用其插件系统,这似乎提供了我需要的一切,并且最重要的是它使用了我已经决定用于IOC的Autofac!

Griffin.MvcContrib - The plugin system

1 个答案:

答案 0 :(得分:1)

使用自定义VirtualPathProvider并添加对BuildManager的引用只是解决方案的一部分。您还需要修改视图并指定用于DLL中每个视图的布局。

接下来,您还必须使用@inherits代替@model视图。

或者你可以简单地使用Griffin.MvcContrib来处理所有事情:http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/