.NET - Razor fuera de la aplicación MVC - Problemas para eliminar @inherits y proporcionar @model

Perdón por la larga pregunta. Lo dividí en tres problemas que se pueden leer por separado. Si puedes ayudarme con un problema, ¡hazlo!

Tengo una implementación personalizada de un motor Razor en su lugar. Todos los trabajos y plantillas están compilados y pueden usarse. Hay alguna implementación a mano que implica una clase base que tiene un genérico Model propiedad que permite vistas fuertemente tipadas (plantillas). En este punto estoy usando un @inherits directiva para definir la clase base y su tipo genérico.

La respuesta de GVS aquí (Hospedar el motor Razor View usando un modelo de vista), donde dice que usar @model es en realidad una abreviatura de @inherits Class<ModelType> me hace pensar que los dos se pueden intercambiar, sin embargo, este no es el caso.

Esta es mi plantilla

@inherits RazorEngine.TemplateBase<MyProject.TestModel>
@functions {

}
<h1>@Model.TestProperty

Mi lista de deseos

  1. Eliminar el @inherits Directivas
  2. Agrega una @model Directivas

Problemas


Situación actual: Se pueden utilizar todas las compilaciones y plantillas. Sin embargo, tengo un error de intellisense en el @inherits directiva.:

No hay ningún proveedor de compilación registrado para la extensión ".cshtml". Puede registrar uno en machine.config o web.config.

¿Qué pasa aquí?

Tengo un web.config en la carpeta de vistas como se muestra a continuación:

<?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>

    <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" />
            </assemblies>
        </compilation>
    </system.web>

</configuration>

Con la lista de deseos n. ° 1: La eliminación de la @inherits directiva hace que el .Model propiedad de la clase base invisible para Visual Studio y, por lo tanto, da como resultado un error => ¿La respuesta / solución es implementar la lista de deseos n. ° 2?


Con la lista de deseos n. ° 2: Añadiendo el @model directiva arroja el error intellisense en @Model.TestProperty (incluso al salir del @inherits directiva en vigor ...):

El nombre Modelo no existe en el contexto actual.

Información adicional:

Estoy usando el siguiente código para crear una instancia de una plantilla del ensamblado compilado.

var template = (RazorTemplateBase<TModel>)Container.CompiledTemplates.CreateInstance("MyNamespace." + entry.TemplateName + "Template");
template.Model = model;
template.DataSource = dataSource;
template.Execute();
var output = template.Buffer.ToString();
template.Buffer.Clear();
return output;

preguntado el 10 de mayo de 11 a las 14:05

1 Respuestas

  1. puede agregar una referencia a System.Web.WebPages.Razor.dll (en <assemblies>).
    Registra el RazorBuildProvider en un parche de [PreApplicationStartMethod].

  2. que el @model la directiva es exclusiva de MVC.
    Necesitas usar el MvcRazorEngineHost.

contestado el 10 de mayo de 11 a las 18:05

1. Agregar la referencia no tiene ningún efecto. Todavía no hay ningún proveedor de compilación registrado ... 2. ¿ necesitas ¿para? Consulte mi información adicional, estoy usando ese código para crear las instancias de la plantilla. - Ropstah

@Ropstah: 1. Intente registrar explícitamente el RazorBuildProvider en Web.config. msdn.microsoft.com/en-us/library/h0e51sw9.aspx - SLaks

2. Sí; @model no es una sintaxis estándar de Razor. Creo que RazorEngine tiene su propia implementación en alguna parte, pero no lo sé de inmediato. - SLaks

@SLaks: 1. funciona, tiene que estar definido en el main web.config ¡sin embargo! Lo que no me gusta porque esto hace que mi módulo requiera cambios de configuración en lugar de solo un web.config separado que se puede insertar automáticamente .... :( Aunque funciona ... - Ropstah

@Ropstah: Debería poder hacerlo usted mismo en un [PreApplicationStartMethod]. - SLaks

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.