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,…)
    方法


    背景:我正在构建一个静态站点生成器,希望能够提供一个默认布局,这样我就不必在我的许多站点页面中的每一个页面中都指定它。如果模板中提供了一个
    Layout=“layoutName”
    ,则应该可以覆盖默认设置。

    尽管出于这一原因和许多其他原因,我最终决定切换到RazorMachine,但对于需要它的人,这里有一个黑客补丁:

    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);