2012-05-03 24 views
7

Me gustaría usar la siguiente plantilla de afeitar con RazorEngine:RazorEngine - Uso y Disposición Html.Raw

@{ 
    Layout = null; 
} 

@Html.Raw(MyNamespace.MyClass.SomePropertyWithHtml) 

Cuando lo llamo me sale 2 errores - se queja que no puede manejar Diseño y, otro quejándose de que no sabe cómo tratar con el helper Html.

Aquí hay otras preguntas y respuestas que sugieren que esto es posible en v3, y estoy usando el paquete actual en NuGet - v3.0.8 - pero no está claro cómo se hace esto. Actualmente estoy llamándolo así:

string html = RazorEngine.Razor.Parse(File.ReadAllText(path)); 

Otras respuestas se sugiere emplear Razor.SetBaseTemplate en primer lugar, que no aparece en la fuente de corriente o la rama 3.0 en git. Al mirar el código, veo el código haciendo referencia a diseños y secciones, pero el código de diseño parece depender de la resolución de una plantilla por nombre, mientras que lo que estoy tratando de hacer ni siquiera necesita resolver una plantilla, solo necesito que haga frente con el diseño = null. El código también incluye una MvcTemplateBase que parece ofrecer un HtmlHelper en el proyecto web, pero es la única clase en ese proyecto y no se hace referencia en ningún lugar en los proyectos Web o Core.

Esta pregunta similar: RazorEngine issues with @Html

sólo enlaces a la página diciendo que puede encontrar más información allí - la página es sólo una frase corta descripción del proyecto.

Entonces, ¿cómo puedo analizar la vista anterior de Razor con RazorEngine v3.0?

+0

Oh, estás usando RazorEngine ... Una cosa a tener en cuenta es que Razor no es MVC. Se ha trabajado mucho con el nuevo RazorEngine, pero Antaris ha estado muy ocupado últimamente. Debería poder usar '@inherits MvcTemplateBase ' en la parte superior de su archivo para usarlo. – Buildstarted

+2

Gracias por la sugerencia. Me doy cuenta de que Razor y MVC están separados, pero mi objetivo es usar las mismas plantillas MVC Razor dentro y fuera de la tubería ASP.Net normal. La versión en NuGet no contiene una clase llamada MvcTemplateBase. La última versión de Git sí lo hace, pero no es genérica, solo es MvcTemplateBase. Si agrego una línea como @inherits RazorEngine.Razor.MvcTemplateBase obtengo una Excepción en TemplateService.SetModelExplicit quejándose de que el tipo de plantilla no tiene una propiedad llamada Modelo. Ideas? –

Respuesta

2

El Layout propiedad y el ayudante Html no son una parte de TemplateBase, y la implementación de MvcTemplateBase que es una parte de la última versión del RazorEngine (v3.4.1) aparece incompleta (InitHelpers no parece inicializar los ayudantes ?). Tendrá que crear su propia plantilla base que implemente estas funciones.

Como ha señalado, las versiones v3 + no incluyen un método Razor.SetBaseTemplate. Se puede establecer un tipo de plantilla de base en la versión actual de este modo:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     BaseTemplateType = typeof(MyTemplateBase<>) 
    }; 

using (var service = new RazorEngine.Templating.TemplateService(config)) 
{ 
    Razor.SetTemplateService(service); 
    return MvcHtmlString.Create(Razor.Parse<TModel>(templateText, model)); 
} 

caso de que necesite para inicializar ayudantes, puede ser útil para anular CreateInstance en una implementación personalizada de IActivator, que puede ser proporcionada a la TemplateServiceConfiguration como el BaseTemplateType:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     BaseTemplateType = typeof(MyTemplateBase<>), 
     Activator = new MyActivator() 
    }; 
+0

Hmm, ¿qué versión de RazorEngine estás usando? ¿O derivaste MvcTemplateBase como tu propia clase? La fuente actual no tiene una versión genérica de MvcTemplateBase: https://github.com/Antaris/RazorEngine/blob/master/src/Web/RazorEngine.Mvc/MvcTemplateBase.cs –

+0

Esa es una implementación propia de MvcTemplateBase.El objetivo de todo lo anterior es demostrar que todavía * puede * establecer una plantilla base para heredar todas sus vistas, lo que le permitirá implementar el helper Html, la funcionalidad de diseño base, o lo que sea que necesite ese TemplateBase de RazorEngine no ofrece fuera de la caja. – jdmcnair

+0

Aclarado mi respuesta anterior. Me di cuenta antes de que esta pregunta tiene más de 2 años, pero creo que todavía la responde. Avíseme si algo no está claro. Quizás esto todavía ayudará a alguien. – jdmcnair