MVC 5自定义视图引擎加载外部控制器和视图

本文关键字:视图 外部 控制器 加载 引擎 自定义 MVC | 更新日期: 2023-09-27 18:16:54

要求

我有一个项目,其中一个要求是加载外部小型网站,如插件。当然,这些网站必须满足一些要求(比如mvc和net版本以及其他更多的要求,以使其兼容(。

这个插件必须在我的MVC网站内的一个新文件夹中分配。在它有视图文件夹和编译的网站dll结果(控制器,模型,…(

当前发展

我实现了一个自定义的ViewEngine来从这个文件夹加载视图,以及一个ControllerFactory,它为不在我的主网站中的控制器提供了技巧。

我的代码基于http://christianjvella.com/wordpress/mef-mvc-defining-controllerfactory/对于ControllerFactory和Can I指定一个自定义位置以";搜索视图";在ASP.NET MVC中?对于ViewEngines

问题

所有这些似乎都适用于一个简单的html视图。但是,当我使用一些MVC助手或对象(如ViewBag、@Url.Content、@Html.DropDownList(时,我会出现一个错误,即该对象为null或不存在。

覆盖ViewEngine中的CreateView方法,它正确返回一个IView实例,controllerContext具有ViewBag和其他必要的功能。

在视图呈现的时候,MVC似乎没有将controllerContext附加到视图实例。。。

这是MVC的一个限制吗?MVC不将controllerContext传递给外部加载的视图或外部控制器?有什么想法或变通办法吗?

MVC 5自定义视图引擎加载外部控制器和视图

您的视图必须经过预编译。您可以使用预编译的MVC视图来执行此操作。预编译视图是使用名为RazorGenerator的VS Addin创建的。

你可以在这里阅读更多,下面的例子将视图放在单独的类库中,你正在寻找的一些东西:

http://www.c-sharpcorner.com/UploadFile/97fc7a/article-precompiled-razor-view-using-razorgenerator-mvc-and/

好吧,我忘了把web.config包含在plugins-Views文件夹中,因为它定义了Razor和MVC dll引用,所以它工作得很好。

感谢所有

您还可以使用VirtualPathProvider来服务其他程序集的内容,包括静态资产和视图。通过这种方式,您可以使用标准的ViewENgine

https://www.nuget.org/packages/EmbeddedResourceVirtualPathProvider/