2012-07-10 19 views

Respuesta

49

llegué plantillas comunes y un trabajo de diseño, con la ayuda de estos dos mensajes:

RazorEngine string layouts and sections?

http://blogs.msdn.com/b/hongyes/archive/2012/03/12/using-razor-template-engine-in-web-api-self-host-application.aspx

Esta es mi solución:

Solución 1: diseño

Uso d configurando _Layout

@{ 
    _Layout = "Layout.cshtml"; 
    ViewBag.Title = Model.Title; 
} 

pie de página

@section Footer 
{ 
    @RenderPart("Footer.cshtml") 
} 

Layout.cshtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> 
    <head> 
    </head> 
    <body> 
     <div id="content"> 
      @RenderBody() 
     </div> 
     @if (IsSectionDefined("Footer")) 
     { 
      <div id="footer"> 
       @RenderSection("Footer") 
      </div> 
     } 
    </body> 
</html> 

TemplateBaseExtensions

Extender TemplateBase con un RenderPart Método

public abstract class TemplateBaseExtensions<T> : TemplateBase<T> 
{ 
    public string RenderPart(string templateName, object model = null) 
    { 
     string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", templateName); 
     return Razor.Parse(File.ReadAllText(path), model); 
    } 
} 

Razor Config

Conjunto BaseTemplateType a su clase TemplateBaseExtensions

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration 
{ 
    BaseTemplateType = typeof(TemplateBaseExtensions<>) 
}; 

Razor.SetTemplateService(new TemplateService(templateConfig)); 

Editar Solución 2:

Si está utilizando una TemplateResolver.RenderPart no es necesario el uso del @include lugar

pie de página

@section Footer 
{ 
    @Include("Footer.cshtml") 
} 

Resolver

public class TemplateResolver : ITemplateResolver 
{ 
    public string Resolve(string name) 
    { 
     if (name == null) 
     { 
      throw new ArgumentNullException("name"); 
     } 

     string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", name); 
     return File.ReadAllText(path, System.Text.Encoding.Default); 
    } 
} 

Config

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration 
{ 
    Resolver = new TemplateResolver() 
}; 
Razor.SetTemplateService(new TemplateService(templateConfig)); 

actualización por The Muffin Man especificar una plantilla y hacer una cadena

var templateResolver = Razor.Resolve("Registration.cshtml"); 
return templateResolver.Run(new ExecuteContext()); 

También yo, junto con los demás en este enlace https://github.com/Antaris/RazorEngine/issues/61 tenido problemas con el uso de _Layout mientras que Layout trabajaban.

'_Layout' es la sintaxis anterior. Se actualizó a 'Diseño' en una versión futura.

+0

me trató de implementar la solución en el blog MS arriba y me siguen dando una excepción stackoverflow. He pasado todo el día en esto. –

+0

Puedo enviarte una aplicación rápida ive lanzada para que entiendas la idea – ministrymason

+1

https://rapidshare.com/files/3962348204/RazorEngineConsoleApplication.zip Ha sido unida pero seguro que entenderás. La base de aplicación es RazorEngineConsoleApplication \ bin \ Debug, así que he copiado las plantillas allí. Atenerme al ejemplo que publiqué. – ministrymason

0

Puede hacer muchas cosas fácilmente con Razor; sin embargo, ese proyecto en particular parece abstraer mucho del material del motor Razor que podrías hacer (que es bueno y malo). En su situación, parece que sería mejor implementar su propia solución Razor (en realidad no es tan mala) y luego puede hacer que sus plantillas generen excepciones o que capturen otro contenido con bastante facilidad.

Por ejemplo; rodar su propia solución le permite hacer una clase base para sus plantillas de afeitar que pueden exponer la capacidad de obtener "vistas parciales" invocando otras plantillas. Además, puede hacer control de modelo y lanzar excepciones si ciertas propiedades son nulas.

0

La forma más sencilla de implementar un diseño con RazorEngine es mediante la sustitución de lo que su declaración de plantilla en el @RenderBody() de la disposición:

var finalHtml = layout.Replace(@"@RenderBody()", templateHtml); 

Ej:

Su _Layout.cshtml con el @RenderBody típica()

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> 
    <head> 
    </head> 
    <body> 
     <div> 
      @RenderBody() 
     </div> 
    </body> 
</html> 

la plantilla RazorEngine MyTemplate.cshtml

@using RazorEngine.Templating 
@inherits TemplateBase<myviewmodel> 

<h1>Hello People</h1> 
<p>@Model</p> 

Y donde quiera que se llama a la plantilla RazorEngine:

var TemplateFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EmailTemplates"); 
var template = File.ReadAllText(Path.Combine(TemplateFolderPath,"MyTemplate.cshtml")); 
var layout = File.ReadAllText(Path.Combine(TemplateFolderPath, "_Layout.cshtml")); 
var templateService = new TemplateService(); 
var templateHtml = templateService.Parse(template, myModel, null, null); 
var finalHtml = layout.Replace(@"@RenderBody()", templateHtml);