Can you recommend a .net template engine?

asp.netTemplatesViewengineTemplating Engine

asp.net Problem Overview


I am looking for a .net templating engine - something simple, lightweight, stable with not too many dependencies. All I need it for at the moment is creating templated plain text and html emails. Can anyone give me a good recommendation?

If it helps at all - something like Java's Freemarker or Velocity libraries.

[UPDATE] Thanks for the answers so far - much appreciated. I am really intested in recommendations or war stories from when you have used these libraries. Seems to be the best way to make a decision without trying each in turn.

asp.net Solutions


Solution 1 - asp.net

Here's a couple more:

About NVelocity, it has been forked by the Castle guys, it's being developed here

For emails, I've never needed more than NVelocity.

Solution 2 - asp.net

RazorEngine, A templating engine built on Microsoft's Razor parsing engine.

https://github.com/Antaris/RazorEngine

Haven't used it, but I find it interesting because if you have an ASP.NET MVC background, you won't need to learn something new.

Solution 3 - asp.net

More Complete List

  • ASP.Net inbuilt WebForm View Engine
  • ASPView
  • Brail
  • NHaml (.Net port of Haml)
  • Spark
  • NVelocity
  • StringTemplate.Net

Solution 4 - asp.net

I would recommend CodeSmith Generator. It is a template based code generator, with constant updates and an active community. Here is a list of templates that ship with CodeSmith Generator.

Solution 5 - asp.net

string template from the anltr.org folks with a C# version too.

Solution 6 - asp.net

Some tests with Handlebars, RazorEngine and SharpTAL below :

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.";
    }
}


}

and results :

code results

Solution 7 - asp.net

I've just released an open source project. It's aimed principally at email templating but you could use the parser by itself if you wanted to. You can read some more details and grab the source code from my blog.

http://thecodedecanter.wordpress.com/2010/07/19/town-crier-an-open-source-e-mail-templating-engine-for-net/

Solution 8 - asp.net

I think Mustache (http://mustache.github.com/) may fit the bill too.

Solution 9 - asp.net

DotLiquid is very nice templating system for .NET.

It's derived from Ruby’s Liquid Markup, with requirements .NET Framework 3.5 or above.

Solution 10 - asp.net

try this one: Email Template Framework http://www.bitethebullet.co.uk/Email_Template_Framework.aspx

It works great under ASP.NET and WinForms and is still under active development. There is also very nice documentation and easy to dig in examples.

Solution 11 - asp.net

XCST (eXtensible C-Sharp Templates)

<ul>
   <c:for-each name='n' in='System.Linq.Enumerable.Range(1, 5)' expand-text='yes'>
      <li>{n}</li>
   </c:for-each>
</ul>

Solution 12 - asp.net

Have you seen NVelocity, a .NET port of Velocity? http://nvelocity.sourceforge.net/

Solution 13 - asp.net

Solution 14 - asp.net

NVELOCITY, though it's old ,last release in 2003, enough.

Solution 15 - asp.net

SharpTAL - standalone engine in active development and without dependencies, fast

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionserg10View Question on Stackoverflow
Solution 1 - asp.netMauricio SchefferView Answer on Stackoverflow
Solution 2 - asp.netCGKView Answer on Stackoverflow
Solution 3 - asp.netPalaniView Answer on Stackoverflow
Solution 4 - asp.netKellyCoinGuyView Answer on Stackoverflow
Solution 5 - asp.netkennyView Answer on Stackoverflow
Solution 6 - asp.netNigrimmistView Answer on Stackoverflow
Solution 7 - asp.netOenotriaView Answer on Stackoverflow
Solution 8 - asp.netmp31415View Answer on Stackoverflow
Solution 9 - asp.netdnsView Answer on Stackoverflow
Solution 10 - asp.netbinballView Answer on Stackoverflow
Solution 11 - asp.netMax ToroView Answer on Stackoverflow
Solution 12 - asp.netMattValerioView Answer on Stackoverflow
Solution 13 - asp.netSamikshaView Answer on Stackoverflow
Solution 14 - asp.netTredencyView Answer on Stackoverflow
Solution 15 - asp.netrlackoView Answer on Stackoverflow