Scriban 是一个专为 .NET 提供的高性能、灵活的模板引擎。通过简单易懂的语法,它可以帮助开发者动态生成 HTML、文本或其他格式内容。得益于其丰富多样的功能和稳定的性能,Scriban 正成为 .NET 开发者的不二之选。这个组件,我基本用于生成项目脚手架用。
在项目中添加 Scriban 包
BashInstall-Package Scriban
以下代码展示了 Scriban 如何处理简单的模板渲染:
C#using Scriban;
namespace AppScriban
{
internal class Program
{
static void Main(string[] args)
{
var template = Template.Parse("Hello {{ name }}!");
var result = template.Render(new { name = "World" });
Console.WriteLine(result);
Console.ReadKey();
}
}
}
解释:
{{ name }}
是一个占位符。Render
方法通过匿名对象为模板赋值。使用 if-else
语法,轻松实现条件逻辑:
C#using Scriban;
namespace AppScriban
{
internal class Program
{
static void Main(string[] args)
{
var template = Template.Parse(@"
{{ if age >= 18 }}
你是一个成人.
{{ else }}
你是一个未成年人.
{{ end }}
");
var result = template.Render(new { age = 19 });
Console.WriteLine(result);
Console.ReadKey();
}
}
}
Scriban 的 for
循环用于遍历集合,如下演示了渲染一个简单的 HTML 列表:
C#using Scriban;
namespace AppScriban
{
internal class Program
{
static void Main(string[] args)
{
var template = Template.Parse(@"
<ul>
{{ for item in items }}
<li>{{ item }}</li>
{{ end }}
</ul>
");
var result = template.Render(new { items = new[] { "Apple", "Banana", "Cherry" } });
Console.WriteLine(result);
Console.ReadKey();
}
}
}
Scriban 提供了丰富的函数和过滤器,处理字符串、数字和集合非常方便。
array.add
array.add_range
array.compact
array.concat
array.cycle
array.any
array.each
array.filter
array.first
array.insert_at
array.join
array.last
array.limit
array.map
array.offset
array.remove_at
array.reverse
array.size
array.sort
array.uniq
array.contains
html.newline_to_br
html.url_encode
html.url_escape
math.abs
math.ceil
math.divided_by
math.floor
math.format
math.is_number
math.minus
math.modulo
math.plus
math.round
math.times
math.uuid
math.random
object.to_json
object.default
object.eval
object.eval_template
object.format
regex.unescape
regex.split
string.capitalize
string.contains
string.empty
string.escape
string.md5
string.sha1
string.sha256
string.pluralize
string.prepend
string.remove
string.size
string.split
string.upcase
具体可见
Markdownhttps://github.com/scriban/scriban/blob/master/doc/builtins.md
这些函数覆盖了对常见数据结构的处理,如数组、字符串、对象、数学运算、正则表达式匹配等。
C#using Scriban;
namespace AppScriban
{
internal class Program
{
static void Main(string[] args)
{
var template = Template.Parse("The length of 'Hello' is {{ 'Hello' | string.size }}.");
var result = template.Render();
Console.WriteLine(result);
Console.ReadKey();
}
}
}
除了内置函数,开发者还可以定义自己的函数:
C#using Scriban;
using Scriban.Runtime;
namespace AppScriban
{
internal class Program
{
static void Main(string[] args)
{
var scriptObject1 = new ScriptObject();
scriptObject1.Import("myfunc", new Func<string>(() => "Yes"));
var context = new TemplateContext();
context.PushGlobal(scriptObject1);
var template = Template.Parse("This is myfunc: `{{myfunc}}`");
var result = template.Render(context);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
模板继承让你可以复用母版布局来简化嵌套模板开发。
HTML<html>
<head>
<title>{{ page.title }}</title>
</head>
<body>
<h1>{{ page.title }}</h1>
{{ page.content }}
</body>
</html>
text{{ page = { title: "Welcome", content: "This is an example." } }} {{ include 'base' }}
用代码加载模板并渲染:
C#using Scriban;
using Scriban.Parsing;
using Scriban.Runtime;
namespace AppScriban
{
public class FileTemplateLoader : ITemplateLoader
{
private readonly string _templateDir;
public FileTemplateLoader(string templateDir)
{
_templateDir = templateDir;
}
// 将模板名称转换为完整路径
public string GetPath(TemplateContext context, SourceSpan callerSpan, string templateName)
{
return Path.Combine(_templateDir, $"{templateName}.scriban");
}
public string Load(TemplateContext context, SourceSpan callerSpan, string templatePath)
{
if (!File.Exists(templatePath))
{
throw new FileNotFoundException($"Template file not found: {templatePath}");
}
return File.ReadAllText(templatePath);
}
public async ValueTask<string> LoadAsync(TemplateContext context, SourceSpan callerSpan, string templatePath)
{
if (!File.Exists(templatePath))
{
throw new FileNotFoundException($"Template file not found: {templatePath}");
}
return await File.ReadAllTextAsync(templatePath);
}
}
internal class Program
{
static void Main(string[] args)
{
// 获取当前目录作为模板目录
string templateDir = Environment.CurrentDirectory;
// 创建模板加载器
var templateLoader = new FileTemplateLoader(templateDir);
// 创建模板上下文
var context = new TemplateContext
{
TemplateLoader = templateLoader, // 设置模板加载器
EnableRelaxedMemberAccess = true, // 启用宽松的成员访问
EnableRelaxedTargetAccess = true // 启用宽松的目标访问
};
// 添加全局变量
var globalObject = new ScriptObject();
// 可以添加其他全局变量
// globalObject["siteName"] = "My Website";
// globalObject["currentYear"] = DateTime.Now.Year;
context.PushGlobal(globalObject);
try
{
// 直接解析子模板,子模板会通过include指令引用基础模板
var childTemplate = Template.Parse(File.ReadAllText("child.scriban"));
// 渲染子模板
var result = childTemplate.Render(context);
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
Console.ReadKey();
}
}
}
Scriban 支持以自定义对象模型作为数据源,方便处理复杂场景:
C#using Scriban;
using Scriban.Parsing;
using Scriban.Runtime;
namespace AppScriban
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
internal class Program
{
static void Main(string[] args)
{
var template = Template.Parse(@"
{{ person.name }} is {{ person.age }} years old.
{{ if person.age >= 18 }}
{{ person.name }} is an adult.
{{ else }}
{{ person.name }} is a minor.
{{ end }}
");
var result = template.Render(new { person = new Person { Name = "Alice", Age = 25 } });
Console.WriteLine(result);
Console.ReadKey();
}
}
}
通过本文的介绍和实践示例,你已经掌握了 Scriban 的核心能力和高级用法。从简单的模板到复杂的继承场景,Scriban 都能胜任,同时通过优化提升性能。
如果你正在寻找一个高性能、灵活的模板引擎,不妨尝试将 Scriban 运用于你的实际项目中!与其共创高效的开发体验,助力你的 .NET 应用更上一层楼!
关注我们,了解更多实用开发技巧推荐,让编程更高效更有趣! 😊
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!