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

时间:2014-08-07 18:33:49

标签: c# asp.net-mvc asp.net-mvc-5 external viewengine

需要量

我有一个项目,其中一个要求是加载外部小网站,如插件。 这个网站当然必须完成一些要求(比如mvc和网络版等,以使其兼容)。

此插件必须分配到我的MVC网站内的新文件夹中。在其中有Views文件夹和编译的网站DLL结果(控制器,模型,......)

当前发展

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

我将我的代码基于http://christianjvella.com/wordpress/mef-mvc-defining-controllerfactory/用于ControllerFactory,Can I specify a custom location to "search for views" in ASP.NET MVC?用于ViewEngines

问题

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

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

似乎在视图渲染时,MVC没有附加controllerContext来查看实例...

这是MVC的限制,它不会将controllerContext传递给外部加载的视图或外部控制器吗?任何想法或解决方法?

3 个答案:

答案 0 :(得分:2)

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

您可以在这里阅读更多相关内容,下面的示例将Views放在单独的类库中! ,你正在寻找一些东西:

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

答案 1 :(得分:0)

好吧,我忘了在插件视图文件夹中包含web.config,它工作正常,因为它定义了Razor和MVC dll引用。

全部谢谢

答案 2 :(得分:0)

您还可以使用VirtualPathProvider从其他程序集中提供服务,包括静态资源和视图。这样您就可以使用标准的ViewENgine

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