Estoy usando el motor Razor https://github.com/Antaris/RazorEngine para analizar el cuerpo de mis plantillas de correo electrónico. ¿Es posible definir un diseño e incluir otros archivos .cshtml? por ejemplo, un encabezado común y un pie de página.Diseños RazorEngine
Respuesta
llegué plantillas comunes y un trabajo de diseño, con la ayuda de estos dos mensajes:
RazorEngine string layouts and sections?
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.
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.
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);
- 1. RazorEngine - Uso y Disposición Html.Raw
- 2. Problemas con RazorEngine con @Html
- 3. Qt Crear diseños y agregar widgets a diseños dinámicamente
- 4. ¿Cómo se almacenan en caché las plantillas en RazorEngine?
- 5. PlantUML diferentes diseños
- 6. nanoc y diseños múltiples
- 7. diseños en expressjs
- 8. OpenGL y diseños
- 9. CakePHP, extensiones y diseños
- 10. Animaciones suaves para diseños pesados
- 11. Diseños de representación con Backbone.js
- 12. Rails 3.2 Diseños de motor
- 13. Anchuras recomendadas para diseños receptivos
- 14. Aleatorización de diseños experimentales equilibrados
- 15. Cómo reutilizar diseños en WPF
- 16. Mejores prácticas de diseños HTML
- 17. Ruby GUI (diseños no complejos)
- 18. Diseños de Android en subcarpetas
- 19. Diseños de fluido con CSS
- 20. Efecto de desvanecimiento entre diseños
- 21. Extracción de diseños de teclado desde Windows
- 22. iOS equivalente a Fragmentos/Diseños de Android
- 23. Diseños anidados en ruby on rails
- 24. Galería de buenos diseños de UITableView
- 25. Injectview (Roboguice) no funciona con varios diseños
- 26. ¿Cómo previene soluciones o diseños complicados?
- 27. ¿Cambiar img src en diseños receptivos?
- 28. usando diferentes diseños para un controlador completo
- 29. Diferentes diseños de filas en ListView
- 30. Botón OnClick Oyente en diseños incluidos
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. –
Puedo enviarte una aplicación rápida ive lanzada para que entiendas la idea – ministrymason
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