Razor 通过在调用代码而不是模板中指定布局来构建RazoEngine模板?
使用,给定两个字符串:Razor 通过在调用代码而不是模板中指定布局来构建RazoEngine模板?,razor,razorengine,Razor,Razorengine,使用,给定两个字符串: 没有指定布局的Razor模板 <h1>My template</h1> 如何实现这个ParseWithTemplate(String,String,…)方法 背景:我正在构建一个静态站点生成器,希望能够提供一个默认布局,这样我就不必在我的许多站点页面中的每一个页面中都指定它。如果模板中提供了一个Layout=“layoutName”,则应该可以覆盖默认设置。尽管出于这一原因和许多其他原因,我最终决定切换到RazorMachine,但对于需要它的
- 没有指定布局的Razor模板
如何实现这个<h1>My template</h1>
方法ParseWithTemplate(String,String,…)
背景:我正在构建一个静态站点生成器,希望能够提供一个默认布局,这样我就不必在我的许多站点页面中的每一个页面中都指定它。如果模板中提供了一个
,则应该可以覆盖默认设置。尽管出于这一原因和许多其他原因,我最终决定切换到RazorMachine,但对于需要它的人,这里有一个黑客补丁:Layout=“layoutName”
var finalHtml = layoutHtml.Replace(@"@RenderBody()", templateHtml);
(感谢Github上的aviatrix。)如果预编译布局模板,您应该能够通过将模板强制转换到TemplateBase来直接设置布局。如果以后在模板标记中指定布局,这将在执行模板时根据需要覆盖代码中的值ITemplateService templateService = ...; // Ensure layout template is cached with layoutCacheName templateService.GetTemplate(layoutAsString, model, layoutCacheName); ITemplate template = templateService.GetTemplate(templateAsString, model, templateCacheName); var templateBase = template as TemplateBase; if (templateBase != null) templateBase.Layout = layoutCacheName;
扩展Ryan Norbauer的答案,实现布局的最简单方法是: 您的\u Layout.cshtml带有典型的@RenderBody()
正如您所看到的,非常简单,只需将MyTemplate.cshtml返回的内容放在@RenderBody()中即可。FWIW,我深入研究了Razor引擎源代码,决定不使用该库。API和体系结构有点难以遵循,并且在不改变源代码本身的情况下,很难自定义上述内容。我决定使用更加用户友好、文档更完善、功能更丰富(尽管似乎不太知名)的剃须刀机器库。(见和)var finalHtml = layoutHtml.Replace(@"@RenderBody()", templateHtml);
ITemplateService templateService = ...; // Ensure layout template is cached with layoutCacheName templateService.GetTemplate(layoutAsString, model, layoutCacheName); ITemplate template = templateService.GetTemplate(templateAsString, model, templateCacheName); var templateBase = template as TemplateBase; if (templateBase != null) templateBase.Layout = layoutCacheName;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> </head> <body> <div> @RenderBody() </div> </body> </html>
@using RazorEngine.Templating @inherits TemplateBase<myviewmodel> <h1>Hello People</h1> <p>@Model</p>
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);