Compile and execute Razor templates outside MVC applications.
Features:
- .NET 7.0
- .NET 6.0
- Windows / Linux
- Publish as single file supported
- Thread safe
Every single star makes maintainer happy! β
To use RazorEngineCore in a project, install the package with NuGet:
dotnet new install Razor.Engine.Core
RazorEngine razorEngine = new RazorEngine();
RazorEngineCompiledTemplate template = razorEngine.Compile("Hello @Model.Name");
string result = template.Run(new
{
Name = "Alexander"
});
Console.WriteLine(result);
RazorEngine razorEngine = new RazorEngine();
string templateText = "Hello @Model.Name";
// yeah, heavy definition
RazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> template = razorEngine.Compile<RazorEngineTemplateBase<TestModel>>(templateText);
string result = template.Run(instance =>
{
instance.Model = new TestModel()
{
Name = "Hello",
Items = new[] {3, 1, 2}
};
});
Console.WriteLine(result);
Most expensive task is to compile template, you should not compile template every time you need to run it
RazorEngine razorEngine = new RazorEngine();
RazorEngineCompiledTemplate template = razorEngine.Compile("Hello @Model.Name");
// Save to file
template.SaveToFile("myTemplate.dll");
// Save to stream
MemoryStream memoryStream = new MemoryStream();
template.SaveToStream(memoryStream);
RazorEngineCompiledTemplate template1 = RazorEngineCompiledTemplate.LoadFromFile("myTemplate.dll");
RazorEngineCompiledTemplate template2 = RazorEngineCompiledTemplate.LoadFromStream(myStream);
RazorEngineCompiledTemplate<MyBase> template1 = RazorEngineCompiledTemplate<MyBase>.LoadFromFile<MyBase>("myTemplate.dll");
RazorEngineCompiledTemplate<MyBase> template2 = RazorEngineCompiledTemplate<MyBase>.LoadFromStream<MyBase>(myStream);
RazorEngineCore is not responsible for caching. Each team and project has their own caching frameworks and conventions therefore making it impossible to have builtin solution for all possible needs.
If you dont have one, use following static ConcurrentDictionary example as a simplest thread safe solution.
private static ConcurrentDictionary<int, RazorEngineCompiledTemplate> TemplateCache = new ConcurrentDictionary<int, RazorEngineCompiledTemplate>();
private string RenderTemplate(string template, object model)
{
int hashCode = template.GetHashCode();
RazorEngineCompiledTemplate compiledTemplate = TemplateCache.GetOrAdd(hashCode, i =>
{
RazorEngine razorEngine = new RazorEngine();
return razorEngine.Compile(Content);
});
return compiledTemplate.Run(model);
}
ASP.NET Core way of defining template functions:
<area>
@{ RecursionTest(3); }
</area>
@{
void RecursionTest(int level)
{
if (level <= 0)
{
return;
}
<div>LEVEL: @level</div>
@{ RecursionTest(level - 1); }
}
}
Output:
<div>LEVEL: 3</div>
<div>LEVEL: 2</div>
<div>LEVEL: 1</div>
string content = @"Hello @A, @B, @Decorator(123)";
RazorEngine razorEngine = new RazorEngine();
RazorEngineCompiledTemplate<CustomTemplate> template = razorEngine.Compile<CustomTemplate>(content);
string result = template.Run(instance =>
{
instance.A = 10;
instance.B = "Alex";
});
Console.WriteLine(result);
public class CustomTemplate : RazorEngineTemplateBase
{
public int A { get; set; }
public string B { get; set; }
public string Decorator(object value)
{
return "-=" + value + "=-";
}
}
Keep your templates as simple as possible, if you need to inject "unusual" assemblies most likely you are doing it wrong.
Writing @using System.IO
in template will not reference System.IO assembly, use builder to manually reference it.
RazorEngine razorEngine = new RazorEngine();
RazorEngineCompiledTemplate compiledTemplate = razorEngine.Compile(templateText, builder =>
{
builder.AddAssemblyReferenceByName("System.Security"); // by name
builder.AddAssemblyReference(typeof(System.IO.File)); // by type
builder.AddAssemblyReference(Assembly.Load("source")); // by reference
});
string result = compiledTemplate.Run(new { name = "Hello" });
- wdcossey/RazorEngineCore.Extensions
- HTML values encoded by default
- Template precompiling
- Direct model usage without RazorEngineTemplateBase
template.Run(object model = null) template.RunAsync(object model = null) template.Run<TModel>(TModel model = null) template.RunAsync<TModel>(TModel model = null)
If you want to contribute, great! We'd love your help!
For more in-depth information on contributing to the project and how to get started, see CONTRIBUTING.