1

使用Antaris RazorEngine,给定两个字符串:

  • 没有指定布局的 Razor 模板

    <h1>My template</h1>
    
  • 以及应该在其中呈现它的布局

    <html>RenderBody()</html>
    

我希望能够解析/编译字符串并在执行解析的代码中设置布局。就像是:

ParseWithTemplate(templateAsString, layoutAsString, model, etc.);

我该如何实现这个ParseWithTemplate(String, String, ...)方法?

背景:我正在构建一个静态站点生成器,并且想要一种提供默认布局的方法,这样我就不必在我的许多站点页面中的每一个页面中都指定它。Layout = "layoutName"如果模板中提供了a ,则应该可以覆盖默认值。

4

3 回答 3

1

如果您预编译布局模板,您应该可以通过将模板转换为 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;
于 2014-03-31T15:01:40.400 回答
0

尽管出于这个和许多其他原因我最终决定切换到 RazorMachine,但对于任何需要它的人来说,这里有一个 hacky 修复:

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

(感谢 Github 上的 aviatrix。)

于 2014-03-25T19:09:54.107 回答
0

扩展 Ryan Norbauer 的答案,实现布局的最简单方法是:

您的_Layout.cshtml与典型的 @RenderBody()

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

你的 RazorEngine 模板MyTemplate.cshtml

@using RazorEngine.Templating
@inherits TemplateBase<myviewmodel>

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

无论您在哪里调用 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);

如您所见,非常简单,只需将 MyTemplate.cshtml 返回的内容放入 @RenderBody()

于 2016-10-02T18:23:35.933 回答