gpt4 book ai didi

asp.net-mvc - 类库中的 MEF 和 Razor View

转载 作者:行者123 更新时间:2023-12-03 10:05:07 25 4
gpt4 key购买 nike

我有一个使用 MEF 的复合 ASP .NET MVC 3 Razor 应用程序。如果我要将插件部署为常规 Views 下的 DLL 文件和 View (CSHTML),一切都会好起来的。应用程序中的文件夹。但这不是很干净,如果我不将 View 作为嵌入资源放置在 DLL 文件(以及 Controller 和模型)中,它就不是真正的插件。

我已经关注了很多文章(其中大部分已经过时)。事实上,Stack Overflow 上有一个相当不错的:Controllers and Views inside a Class Library

我还检查了 VirtualPathProvider 的文档并且我已经能够构建一个自定义的,它可以在程序集中找到文件并完美地加载它(或者至少将流传输到它)。为此,我遵循了 VirtualPathProvider documentation on MSDN .

还有一个 VirtualFile 的实现,但还没有 VirtualDirectory 的实现。

这是问题所在。我正在使用 Razor View 。我知道他们需要来自 web.config 的配置规范文件供 Razor 构建它们。但是如果我将它们嵌入到 DLL 中,这个配置就会丢失。

我想知道这是否就是我不断收到错误的原因:

The view at '~/Plugins/CRM.Web.Views.CRM.Index.cshtml' must derive from WebViewPage, or WebViewPage.



也许我只需要添加一些代码即可使其工作?有任何想法吗?

最佳答案

我在类库中嵌入 Razor View 的首选方法是使用后期构建事件将它们复制到 MVC 网站的 View /区域文件夹中。如果您覆盖 ViewEngine 或 VirtualPathProvider,则可以指定自定义 View 位置。

对我来说棘手的部分是让智能感知在这些 View 类库中工作。首先,您必须向 View 程序集中添加一个 Web.Config。请注意,您不必将其实际包含在程序集中。它只需要在程序集根目录(或 View 文件夹)中。这是一个例子。请注意重要的程序集/编译部分。

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>

<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>

<system.web>
<compilation targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>

<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

<!--
Enabling request validation in view pages would cause validation to occur
after the input has already been processed by the controller. By default
MVC performs request validation before a controller processes the input.
To change this behavior apply the ValidateInputAttribute to a
controller or action.
-->
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>

接下来,您需要修改类库的 vbproj 文件,以便所有 OutputPath 元素都指向 'bin\' 而不是 'Debug\bin\' 或 'Release\bin\'。这是我发现的类库和 ASP.Net Web 项目类型之间的主要区别,它们可能导致智能感知错误。

如果您仍然收到必须继承错误,请考虑在您的 View 中使用 @Inherits System.Web.Mvc.WebViewPage。如果您没有将您的 View 复制到您的网站项目中,您可能正在使用自定义 ViewEngine/VirtualPathProvider 从嵌入式资源加载它们。如果是这种情况,您肯定需要 Inherits 以便 Razor 知道不幸的是您的 View 基类是什么。

祝你好运。

关于asp.net-mvc - 类库中的 MEF 和 Razor View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com