Mi forma preferida de incrustar Razor Views en una biblioteca de clases es copiarlas en las carpetas Vistas/Áreas del sitio web de MVC con un evento de compilación posterior. Se pueden especificar ubicaciones de vista personalizadas si anula ViewEngine o VirtualPathProvider.
La parte más difícil para mí fue hacer que intellisense funcionara en estas bibliotecas de View Class. Primero, debe agregar un Web.Config a su ensamblaje de Vista. Tenga en cuenta que no tiene que incluirlo en su conjunto. Solo tiene que estar en el directorio raíz del ensamblaje (o en la carpeta de vistas). Aquí hay un ejemplo. Consulte la sección de ensamblajes/compilación importante.
<?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>
A continuación, resulta necesario modificar el archivo vbproj de la biblioteca de clases de manera que todos los elementos OutputPath apuntan a 'bin \' en lugar de 'depuración \ bin \' o 'Release \ bin \'. Esta es la principal diferencia que encontré entre las bibliotecas de clases y los tipos de proyectos web ASP.Net que pueden causar errores intellisense.
Si aún recibe su error de herencia obligatoria, considere usar @Inherits System.Web.Mvc.WebViewPage en sus vistas. Si no está copiando sus vistas en el proyecto de su sitio web, puede que las esté cargando desde Embedded Resources utilizando un ViewEngine/VirtualPathProvider personalizado. Si ese es el caso, definitivamente necesitas las Heredades para que Razor sepa cuál es desafortunadamente tu clase de base de vistas.
Buena suerte.
Algo en qué pensar: si voy a agregar "@inherits System.Web.Mvc.WebViewPage" en cada archivo cshtml, todo va bastante bien. Sin embargo, no puedo simplemente hacer eso (sería un gran esfuerzo para algo que ya es automático utilizando archivos de vista regulares). Entonces, ¿alguna idea? –
Esta publicación podría ser de alguna ayuda, pero simplemente no puedo probarla ahora. Lo intentaré lo antes posible y publicaré los resultados/respuesta aquí. http://stackoverflow.com/questions/6465855/a-plugin-framework-with-asp-net-mvc3-and-embedded-razor-views –
¿Ya ha intentado poner también el archivo de configuración en una ruta virtual adecuada, de tal forma que simulemos la "disposición estándar" que tenemos en la carpeta Mvc View? –