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

Posted

技术标签:

【中文标题】从其他项目加载非嵌入式视图【英文标题】:Loading non embedded views from other projects 【发布时间】:2012-08-28 20:27:40 【问题描述】:

我正在开发一个应该支持模块的 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 方法中,我像这样返回视图:

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

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

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

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

提前致谢!

编辑:

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

Griffin.MvcContrib - The plugin system

【问题讨论】:

你能添加一个正确的答案吗?否则它可能会因为过于本地化而被关闭。 @jgauffin 如果你想总结一下这个问题的答案,那没有错(实际上鼓励你这样做) 【参考方案1】:

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

接下来,您还必须使用 @inherits 而不是 @model 视图。

或者您可以简单地使用 Griffin.MvcContrib 为您处理一切:http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/

【讨论】:

以上是关于从其他项目加载非嵌入式视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从解决方案中的文件加载 XML 文件,使用嵌入式资源构建?项目 > 跨平台 > Xamarin.Forms

使用自定义 VirtualPathProvider 加载嵌入式资源部分视图

如何响应从 xib 加载的自定义视图中发生的操作?

将容器视图嵌入到 UIScrollView

加载嵌入在导航中的视图控制器

如何重新加载 UIPageViewController 以在 Swift 中重新加载其视图