ZetCode

C# Scriban

最后修改于 2023 年 7 月 5 日

C# Scriban 教程展示了如何在 C# 中使用 Scriban 模板引擎。

Scriban 模板引擎

模板引擎或模板处理器是一种旨在将模板与数据模型相结合以生成文档的库。模板引擎通常用于生成大量电子邮件、在源代码预处理中,或生成动态 HTML 页面。

我们创建一个模板引擎,在其中定义静态部分和动态部分。动态部分稍后会被数据替换。渲染函数稍后会将模板与数据结合起来。模板引擎用于将模板与数据模型结合起来以生成文档。

Scriban 使用 {{ }} 表示代码块,使用 {%{ }%} 表示转义块。任何其他文本都被视为文本块并按原样输出。

Template.Parse 方法将文本数据解析为模板,而 Template.Render 使用提供的数据模型将模板渲染为最终输出。

$ dotnet add package Scriban

我们需要将 Scriban 包添加到我们的项目中。

Scriban 简单示例

以下是一个简单的 Scriban 示例。

Program.cs
using Scriban;

var name = "John Doe";

var tpl = Template.Parse("Hello {{name}}!");
var res = tpl.Render(new { name = name });

Console.WriteLine(res);

该程序向控制台打印一条小消息。

var tpl = Template.Parse("Hello {{name}}!");

Template.Parse 方法将指定的脚本文本解析为模板。 使用 {{ }} 我们输出 name 变量的内容。

var res = tpl.Render(new { Name = name });

Render 方法使用指定的对象模型渲染模板。

$ dotnet run
Hello John Doe!

在下一个示例中,我们将两个变量传递给模板引擎。

Program.cs
using Scriban;

var name = "John Doe";
var occupation = "gardener";

var txt = "{{name}} is a {{occupation}}";
var tpl = Template.Parse(txt);
var res = tpl.Render(new { name, occupation });

Console.WriteLine(res);

该程序使用来自两个变量的数据打印一条消息:nameoccupation

$ dotnet run
John Doe is a gardener

Scriban for 循环

循环是使用 for 指令创建的。

Program.cs
using Scriban;

string[] words = { "sky", "blue", "falcon", "book", "ocean", "dog" };

var html = @"
<ul>
{{- for word in words }}
    <li> {{ word }} </li>
{{- end }}
</ul>
";

var tpl = Template.Parse(html);
var res = tpl.Render(new { words = words });

Console.WriteLine(res);

该示例使用 for 指令将单词数组输出到 HTML 列表中。

{{- for word in words }}
    <li> {{ word }} </li>
{{- end }}

我们遍历单词数组。 - 字符删除左侧的空格字符。

$ dotnet run 
<ul>
    <li>sky</li>
    <li>blue</li>
    <li>falcon</li>
    <li>book</li>
    <li>ocean</li>
    <li>dog</li>
</ul>

Scriban 字符串函数

我们可以在模板中使用多个字符串函数。

Program.cs
using Scriban;

var msg = "an old falcon";

var data = @"
{{ msg | string.capitalize }}
{{ msg | string.upcase }}
The message has {{ msg | string.size }} characters.
The message has {{ msg | string.split ' ' | array.size }} words.
";

var tpl = Template.Parse(data);
var res = tpl.Render(new { msg = msg });

Console.WriteLine(res);

我们有一条字符串消息。 我们对该消息应用了多个字符串函数。

{{ msg | string.capitalize }}
{{ msg | string.upcase }}

我们将消息大写和转换为大写。

The message has {{ msg | string.size }} characters.

我们计算消息中的字符数。

The message has {{ msg | string.split ' ' | array.size }} words.

我们计算消息中的单词数。 除了 string.split 函数之外,我们还使用 array.size 来获取分割字符串数组的大小。

$ dotnet run
An old falcon
AN OLD FALCON
The message has 13 characters.
The message has 3 words.

Scriban 数组函数

Scriban 支持数组函数。

Program.cs
using Scriban;

int[] vals = { 2, 1, -3, 0, -1, -2, 3 };

var data = @"
The array has {{ vals.size }} elements
First element: {{ vals[0] }}
Last element: {{ vals[-1] }}
Sorted elements: {{ vals | array.sort}}
";

var tpl = Template.Parse(data);
var res = tpl.Render(new { vals = vals });

Console.WriteLine(res);

我们有一个整数数组。 使用内置数组函数,我们计算元素并对其进行排序。

$ dotnet run 
The array has 7 elements
First element: 2
Last element: 3
Sorted elements: [-3, -2, -1, 0, 1, 2, 3]

Scriban 条件

我们可以在模板中使用 if/else if/else 条件。

Program.cs
using Scriban;

string?[] names = { "John", "Nelly", null, "George" };

var data = @"
{{- for name in names -}}
  {{ if !name  }}
Hello there!
  {{ else }}
Hello {{name}}!
  {{ end }}
{{- end }}";

var tpl = Template.Parse(data);
var res = tpl.Render(new { names = names });

Console.WriteLine(res);

我们有一个名称数组。 使用 if 条件,我们检查元素是否不为空。

$ dotnet run
Hello John!

Hello Nelly!

Hello there!

Hello George!

Scriban 从文件读取模板

在以下示例中,我们从文件中读取模板文件。

users.tpl
<table>
    <thead>
    <tr>
        <th>Name</th>
        <th>Occupation</th>
    </tr>
    </thead>
    <tbody>
    {{- for user in users }}
    <tr>
        <td>{{ user.name }}</td>
        <td>{{ user.occupation }}</td>
    </tr>
    {{- end }}
    </tbody>
</table>

模板文件以 HTML 表格输出数据。

Program.cs
using Scriban;

var users = new List<User>
{
    new ( "John Doe", "gardener"),
    new ( "Roger Roe", "driver"),
    new ( "Lucy Smith", "teacher")
};

var fileName = "users.tpl";
var data = File.ReadAllText(fileName);

var tpl = Template.Parse(data);
var res = tpl.Render(new { users = users });

Console.WriteLine(res);

record User(string Name, string Occupation);

数据存储在记录列表中。 模板文件使用 File.ReadAllText 方法加载。

$ dotnet run 
<table>
    <thead>
    <tr>
        <th>Name</th>
        <th>Occupation</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>John Doe</td>
        <td>gardener</td>
    </tr>
    <tr>
        <td>Roger Roe</td>
        <td>driver</td>
    </tr>
    <tr>
        <td>Lucy Smith</td>
        <td>teacher</td>
    </tr>
    </tbody>
</table>

来源

Scriban Github 页面

在本文中,我们使用了 C# 中的 Scriban 模板引擎。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程