金沙澳门官网登录-www.js8.com-金沙澳门官网下载app

DotLiquid模板引擎简介

DotLiquid是叁个在.Net Framework上运维的沙盘模拟经营引擎,接纳Ruby的Liquid语法,那么些语法广泛的用在Ruby on rails和Django等网页框架中。
DotLiquid相比较于Mvc暗中同意模板引擎Razor的好处有:

  • DotLiquid模板引擎简介。因为没有必要编写翻译到程序集再载入
    • 第贰回渲染速度快捷
    • 不会招致内部存款和储蓄器泄漏
  • 能够在另各地方使用
    • DotLiquid模板引擎简介。无需先筹算WebViewPage,ViewContext等烦琐的上下文对象

DotLiquid的官方网址是,开源共同商议是不行宽松的MS-PL。

示范代码

自己创立多个用到了DotLiquid的示例Mvc项目,完整代码可以查看这里。
以下的示范将以Mvc中的Action为单位,都贮存在HomeController下。

最根基的选用

Template.Parse能够把字符串深入分析为模板对象,再采用Render把模版对象渲染为字符串。
DotLiquid模板引擎简介。开荒页面能够望见Hello, World!

public ActionResult HelloWorld()
{
    var template = Template.Parse("Hello, {{ name }}!");
    var result = template.Render(Hash.FromAnonymousObject(new { name = "World" }));
    return Content(result);
}

运用过滤器

|末端的正是过滤器,过滤器能够连锁起来使用。
DotLiquid模板引擎简介。escape过滤器用于做html编码,幸免name中的"<"当成是html标签描画。
upcase过滤器把字符串中的字母全体调换为大写。
开拓页面可以知道Hello, <WORLD>!

public ActionResult HelloFilter()
{
    var template = Template.Parse("Hello, {{ name | escape | upcase }}!");
    var result = template.Render(Hash.FromAnonymousObject(new { name = "<World>" }));
    return Content(result);
}

概念过滤器

DotLiquid扶植自定义过滤器,首先要求三个过滤器类型,当中的函数名称便是过滤器名称。
过滤器补助四个参数和暗中同意参数。

public class DotliquidCustomFilter
{
    public static string Substr(string value, int startIndex, int length = -1)
    {
        if (length >= 0)
            return value.Substring(startIndex, length);
        return value.Substring(startIndex);
    }
}

在网站运转的时候把那个过滤器注册到DotLiquid

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // 在原有的代码下添加
        Template.RegisterFilter(typeof(DotliquidCustomFilter));
    }
}

那个事例会显示Hello, orl!

public ActionResult CustomFilter()
{
    var template = Template.Parse("Hello, {{ name | substr: 1, 3 }}!");
    var result = template.Render(Hash.FromAnonymousObject(new { name = "World" }));
    return Content(result);
}

利用标签

DotLiquid中有三种标签,大器晚成种是平常标签(Block),风度翩翩种是自闭合标签(Tag卡塔尔(英语:State of Qatar)。
此地的assign是自闭合标签,if是司空见惯标签,普通标签必要用end+标签字闭合。
来得内容是Hello, World!

public ActionResult HelloTag()
{
    var template = Template.Parse(@"
        {% assign name = 'World' %}
        {% if visible %}
        Hello, {{ name }}!
        {% endif %}
    ");
    var result = template.Render(Hash.FromAnonymousObject(new { visible = true }));
    return Content(result);
}

自定义标签

这里笔者将概念一个自闭合标签conditional,那个标签有多个参数,假设第二个参数成立则描画第4个不然描画第三个参数。

public class ConditionalTag : Tag
{
    public string ConditionExpression { get; set; }
    public string TrueExpression { get; set; }
    public string FalseExpression { get; set; }

    public override void Initialize(string tagName, string markup, List<string> tokens)
    {
        base.Initialize(tagName, markup, tokens);
        var expressions = markup.Trim().Split(' ');
        ConditionExpression = expressions[0];
        TrueExpression = expressions[1];
        FalseExpression = expressions.Length >= 3 ? expressions[2] : "";
    }

    public override void Render(Context context, TextWriter result)
    {
        var condition = context[ConditionExpression];
        if (!(condition == null || condition.Equals(false) || condition.Equals("")))
            result.Write(context[TrueExpression]);
        else
            result.Write(context[FalseExpression]);
    }
}

在网址运营时把这几个标签注册到DotLiquid

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // 在原有的代码下添加
        Template.RegisterTag<ConditionalTag>("conditional");
    }
}

本条事例会展现Bar

public ActionResult CustomTag()
{
    var template = Template.Parse("{% conditional cond foo bar %}");
    var result = template.Render(Hash.FromAnonymousObject(new { cond = false, foo = "Foo", bar = "Bar" }));
    return Content(result);
}

模板文件

DotLiquid也支撑从文件读取模板,须求先定义叁个TemplateFileSystem

public class DotliquidTemplateFileSystem : IFileSystem
{
    public string ReadTemplateFile(Context context, string templateName)
    {
        var path = context[templateName] as string;
        if (string.IsNullOrEmpty(path))
            return path;
        var fullPath = HttpContext.Current.Server.MapPath(path);
        return File.ReadAllText(fullPath);
    }
}

安装DotLiquid使用自定义的文件系统

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // 在原有的代码下添加
        Template.FileSystem = new DotliquidTemplateFileSystem();
    }
}

再定义五个调节器基类

public abstract class DotliquidController : Controller
{
    public ContentResult DotliquidView(string path = null, object parameters = null)
    {
        // 路径为空时根据当前的Action决定
        if (string.IsNullOrEmpty(path))
        {
            var controller = RouteData.Values["controller"];
            var action = RouteData.Values["action"];
            path = $"~/DotliquidViews/{controller}/{action}.html";
        }
        // 根据路径读取模板内容
        var templateStr = Template.FileSystem.ReadTemplateFile(new Context(), "'" + path + "'");
        // 解析模板,这里可以缓存Parse出来的对象,但是为了简单这里就略去了
        var template = Template.Parse(templateStr);
        // 描画模板
        Hash templateParameters;
        if (parameters is IDictionary<string, object>)
            templateParameters = Hash.FromDictionary((IDictionary<string, object>)parameters);
        else
            templateParameters = Hash.FromAnonymousObject(parameters ?? new { });
        var result = template.Render(templateParameters);
        // 返回描画出来的内容
        return Content(result, "text/html");
    }
}

现今得以在调节器中使用基于DotLiquid的沙盘模拟经营了

public ActionResult HelloTemplateFile()
{
    return DotliquidView();
}

下面会回到文件~/DotliquidViews/Home/HelloTemplateFile.html的内容

Hello, Template!

嵌入子模板

为了兑今世码的任用,DotLiquid的沙盘模拟经营还足以停放别的子模板,嵌入供给选择include标签。
以下例子会显得Hello, Include!

public ActionResult HelloInclude()
{
    return DotliquidView();
}

文件~/DotliquidViews/Home/HelloInclude.html的内容

Hello, {% include "~/DotliquidViews/Home/HelloIncludeContents.html" %}!

文件~/DotliquidViews/Home/HelloIncludeContents.html的内容

Include

后续父模板

除开嵌入子模版,还能兑现布局(Layout卡塔尔(قطر‎方式的世袭父模板,世襲须要使用extends和block标签。
以下例子会回来Html<div class="layout"><h1>Here is title</h1><p>Here is body</p></div>

public ActionResult HelloExtends()
{
    return DotliquidView();
}

文件~/DotliquidViews/Home/HelloExtendsLayout.html的内容

<div class="layout">
    <h1>
        {% block title %}
        Default title
        {% endblock %}
    </h1>
    <p>
        {% block body %}
        Default body
        {% endblock %}
    </p>
</div>

文件~/DotliquidViews/Home/HelloExtends.html的内容

{% extends "~/DotliquidViews/Home/HelloExtendLayout.html" %}

{% block title %}
Here is title
{% endblock %}

{% block body %}
Here is body
{% endblock %}

绘画自定义对象

请先看之下的例证

public class ExampleViewModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public ActionResult CustomObject()
{
    var template = Template.Parse("Name: {{ model.Name }}, Age: {{ model.Age }}");
    var model = new ExampleViewModel() { Name = "john", Age = 35 };
    var result = template.Render(Hash.FromAnonymousObject(new { model }));
    return Content(result);
}

您也许预料那么些事例会突显Name: john, Age: 35,但骨子里运转时会给出以下错误

Name: Liquid syntax error: Object 'Dotliquid.Example.Dotliquid.ExampleViewModel' is invalid because it is neither a built-in type nor implements ILiquidizable, Age: Liquid syntax error: Object 'Dotliquid.Example.Dotliquid.ExampleViewModel' is invalid because it is neither a built-in type nor implements ILiquidizable

这是因为DotLiquid为了安全性,私下认可不许描画未经注册的对象,那样固然模板由前端使用者提供也不会导致音讯外泄。
为了缓慢解决地点的谬误,须求把ExampleViewModel注册为可描画的靶子。
除去利用RegisterSafeType挂号,你也能够让ExampleViewModel继承ILiquidizable,在一些场景下会更相符。

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // 在原有的代码下添加
        Template.RegisterSafeType(typeof(ExampleViewModel), Hash.FromAnonymousObject);
    }
}

写在结尾

DotLiquid是多个随声附和相当高并且正视相当少的模版引擎,固然尚无Razor流行,但大气的单元测验保障它能够经得起实际的应用。
如今采取了DotLiquid的品类有

  • Pretzel静态网址生成工具
  • Nancy网页框架
  • ZKWeb网页框架

日前DotLiquid计划升级2.0本子,作者正在召集P路虎极光,尽管你故意向可以到DotLiquid的github看看。

本文由金沙澳门官网登录发布于金沙澳门官网下载app,转载请注明出处:DotLiquid模板引擎简介

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。