RazorEngine布局

我使用Razor引擎https://github.com/Antaris/RazorEngine来解析我的电子邮件模板的正文。 是否可以定义布局并包含其他.cshtml文件? 例如共同的页眉和页脚。


在这两篇文章的帮助下,我得到了常用模板和布局工作:

RazorEngine字符串布局和部分?

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

这是我的解决方案:

解决方案1: 布局

通过设置_Layout来使用

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

页脚

@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

用RenderPart方法扩展TemplateBase

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

剃刀配置

将BaseTemplateType设置为您的TemplateBaseExtensions类

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

Razor.SetTemplateService(new TemplateService(templateConfig));

编辑解决方案2:

如果你正在使用TemplateResolver。 RenderPart不需要使用@Include来代替

页脚

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

分解器

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

配置

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

The Muffin Man更新指定一个模板并呈现一个字符串

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

此外,我和其他人在这个链接https://github.com/Antaris/RazorEngine/issues/61有使用_Layout问题,而Layout工作。

'_Layout'是旧的语法。 它在未来的版本中更新为“布局”。


你可以用剃刀轻松做很多事情; 然而,这个特定的项目似乎将许多Razor引擎的东西抽象掉了(这是好的和坏的)。 在你的情况下,这听起来像你会更好地实现自己的Razor解决方案(实际上并不坏),然后你可以让你的模板很容易地抛出异常或拉入其他内容。

例如; 通过滚动你自己的解决方案,你可以为你的剃须刀模板创建一个基类,它可以通过调用其他模板来暴露出“部分视图”的容量。 另外,如果某些属性为空,则可以执行模型检查并引发异常。


使用RazorEngine实现布局的最简单方法是通过替换布局的@RenderBody()中的模板返回值:

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

例如:

_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);
链接地址: http://www.djcxy.com/p/65091.html

上一篇: RazorEngine layouts

下一篇: RazorEngine issues with @Html