你能推荐一个.NET模板引擎吗?

56
我正在寻找一个 .net 模板引擎 - 简单、轻量级、稳定,没有太多的依赖项。目前我只需要用它来创建模板化的纯文本和 HTML 邮件。有人能给我一个好的建议吗?
如果有帮助的话 - 类似于 Java 的 FreemarkerVelocity 库。
[更新] 非常感谢迄今为止的答案 - 非常感谢。我真的很感兴趣从你使用这些库时得到的推荐或战斗经历。似乎这是在不试图轮流尝试每个库的情况下做出决策的最佳方式。
15个回答

23

这里还有几个:

关于NVelocity,它已被Castle团队分叉,目前正在此处开发

对于电子邮件,我从未需要比NVelocity更多的东西。


1
谢谢你的回复,mausch。你在使用NVelocity时遇到过什么问题吗? - serg10
3
所有链接基本上都失效了。 - Asken
@Asken 只有一个,而且在我看来,对于一个已经有 七年 历史的答案来说,这已经相当不错了。 - Mauricio Scheffer
维护也很重要。已经有了一个Wayback机器 :) - Asken
@Asken 我不会维护一个7年前的答案。但是请随意编辑它并修复任何损坏的链接。 - Mauricio Scheffer
显示剩余2条评论

9
RazorEngine是一个建立在Microsoft的Razor解析引擎上的模板引擎。 https://github.com/Antaris/RazorEngine 我没有使用过它,但我觉得很有趣,因为如果你有ASP.NET MVC背景,就不需要学习新东西。

这是一些依赖项问题,因为使用了旧版本的 system.web.razor 和 razorEngine 需要新版本,所以在本地没有遇到 GAC 组件的问题,但是在远程服务器上却有。最终,我选择使用另一个模板引擎,而不是浪费时间来测试版本冲突等问题。 - QMaster

6

6

更完整的列表

  • ASP.Net 内置的 WebForm 视图引擎
  • ASPView
  • Brail
  • NHaml (Haml 的 .Net 版本)
  • Spark
  • NVelocity
  • StringTemplate.Net

5

4
以下是使用Handlebars、RazorEngine和SharpTAL进行的一些测试:
namespace ConsoleApplication4
{
class Program
{
    static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();

        //RAZOR
        string razorTemplate = @"@model ConsoleApplication4.Test
                                <h1>@Model.Title</h1>
                                @if(Model.Condition1)
                                {
                                    <span>condition1 is true</span>
                                }
                                <div>
                                    @foreach(var movie in Model.Movies)
                                        {<span>@movie</span>}
                                </div>";

        //burning
        Engine.Razor.RunCompile(razorTemplate, "templateKey", typeof(Test), new Test());
        sw.Start();
        var result1 = Engine.Razor.RunCompile(razorTemplate, "templateKey", typeof(Test), new Test());
        sw.Stop();
        Console.WriteLine("razor : "+sw.Elapsed);


        //SHARPTAL
        string sharpTalTemplate = @"<h1>${Title}</h1>             
                                    <span tal:condition=""Condition1"">condition1 is true</span>                                    

                                         <div tal:repeat='movie Movies'>${movie}</div>";


        var test = new Test();
        var globals = new Dictionary<string, object>
        {
            { "Movies", new List<string> {test.Movies[0],test.Movies[1],test.Movies[2] } },
            { "Condition1", test.Condition1 },
            { "Title", test.Title },
        };



        var tt = new Template(sharpTalTemplate);
        tt.Render(globals);
        sw.Restart();
        var tt2 = new Template(sharpTalTemplate);
        var result2 = tt2.Render(globals);
        sw.Stop();
        Console.WriteLine("sharptal : " + sw.Elapsed);



        //HANDLEBARS
        string handleBarsTemplate = @"<h1>{{Title}}</h1>
                                {{#if Condition1}}                                    
                                    <span>condition1 is true</span>
                                {{/if}}
                                <div>
                                    {{#each Movies}}
                                        <span>{{this}}</span>
                                    {{/each}}                                        
                                </div>";
        var tt3 = Handlebars.Compile(handleBarsTemplate);
        sw.Restart();
        var result3 = tt3(new Test());
        sw.Stop();
        Console.WriteLine("handlebars : " + sw.Elapsed);

        Console.WriteLine("-----------------------------");
        Console.WriteLine(result1);
        Console.WriteLine(result2);
        Console.WriteLine(result3);

        Console.ReadLine();
    }
}

public class Test
{
    public bool Condition1 { get; set; }
    public List<string> Movies { get; set; }
    public string Title { get; set; }

    public Test()
    {
        Condition1 = true;
        Movies = new List<string>() { "Rocky", "The Fifth Element", "Intouchables" };
        Title = "Hi stackoverflow! Below you can find good movie list! Have a good day.";
    }
}


}

并且结果:

代码结果


3

DotLiquid 是一个非常好用的.NET模板系统。

它源自于Ruby的Liquid标记语言,并需要.NET Framework 3.5或以上版本。


3

3
我认为Mustache(http://mustache.github.com/)也可以满足要求。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接