The other day, I needed a HTML templating library for C#. I was writing a service which sends out reports and wanted the contents to be formatted HTML. Basically, I was looking for {{ mustache }} style templates similar to JavaScript's handlebars.
As it happens there is a port of of mustache for C# called, wait for it....... Nustache! 🙂 (Gotta love that name!).
But, as with all these things the power Google led me to find out what else was out there. As it turns out there are a number of good tempting libraries for C# including:.
Microsoft Razor
I initially was settling on using DotLiquid until I remembered Microsoft's Razor Pages! They are front and center in the new ASP.NET Core world and Blazor (the experimental C# WebAssembly framework) also uses them.
The great thing about Microsoft's Razor pages is that they easily allow you to mix and layout C# model objects alongside HTML. Visual Studio gives you syntax highlighting and code completion of your C# objects and on top of all that you can add C# if and loop statements to control flow. Its a nice templating library with great IDE support. All you need to do is rename the .html file to .cshtml!
Here's a quick example of Razor syntax:
<h1>Your Action is @modelObj.ActionType </h1>
<p>Some text goes here </p>
@if (!string.IsNullOrEmpty(modelObj.Name))
{
<p>Hello @modelObj.Name! </p>
}
<ul>
@foreach(var favItem in modelObj.FavouriteList)
{
<li>@favItem.Name ( @favItem.Description ) </li>
}
</ul>
<h3>Thats all folks!</h3>
But I didn't know if it was possible to use Razor in a simple C# console application, outside of ASP.Net. After turning back to Google, I found a plethora of libraries out there including:
The list goes on and on, but the two which looked the most promising was RazorEngine and RazorMachine. RazorEngine is the most popular however, for my purposes I went with RazorMachine because it does not produce temporary files (as RazorEngine does).
Helper Class
Using RazorMachine, I knocked up this helper class to help with reading and converting of my cshtml project files
public class RazorView
{
private static RazorMachine m_razorMachine = null;
public string TemplateName { get; set; }
public object Model { get; set; }
public RazorView(string templateName, object model)
{
TemplateName = templateName;
Model = model;
Initialise();
}
public static void Initialise()
{
if (m_razorMachine == null)
m_razorMachine = new RazorMachine();
}
public string Run()
{
string content = null;
if (!string.IsNullOrEmpty(TemplateName))
{
var htmlTemplate = ReadTemplate(TemplateName);
content = m_razorMachine.ExecuteContent(htmlTemplate, Model).Result;
}
return content;
}
private string ReadTemplate(string fileName)
{
string rptTemplate = string.Format(@"{0}\Views\{1}",
AppDomain.CurrentDomain.BaseDirectory, fileName);
if (!File.Exists(rptTemplate))
return "";
var htmlTemplate = System.IO.File.ReadAllText(rptTemplate);
return htmlTemplate;
}
}
With the above class we can then use it as follows:
Person modelObj = new Person();
modelObj.FirstName = "Bart";
modelObj.LastName = "Simpson";
string htmlContent = new RazorView("Test.cshtml", modelObj).Run();
Wrap Up
That's about the long and short of it. I have put a sample project on my github account here https://github.com/OceanAirdrop