Baike.dev
All toolsOnline toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
R

RazorEngineCore

> 编程语言
Open source

.NET10 Razor Template Engine

643 stars0 likes1 views
WebsiteGitHub

About

.NET10 Razor Template Engine

RazorEngineCore

.NET10 Razor Template Engine. No legacy code. No breaking changes.

  • .NET 10
  • .NET 5, 6, 7, 8, 9
  • .NET Standard 2.0
  • .NET Framework 4.7.2
  • Windows / Linux
  • Publish as single file supported
  • Thread safe
  • Template debugging Every single star makes maintainer happy! ⭐

NuGet

Install-Package RazorEngineCore

Feature requests

✅ Feel free to create new issues and vote for existing ones!

Articles

  • Piotr Bakun: How to make PDF invoice with Playwright.NET
  • Christian Schou: How to send email with MailKit
  • Dave Glick: Difference between RazorEngineCore, RazorLight and Statiq, Send email using SendGrid API
  • ‍ Alexander Selishchev: Building String Razor Template Engine with Bare Hands
  • Razor syntax reference

Wiki

  • Package comparison: RazorEngineCore / RazorLight / RazorEngine.NetCore
  • Strongly typed model
  • @Include and @Layout
  • @Raw
  • @Inject and referencing other assemblies
  • Switch from RazorEngine cshtml templates
  • Azure Functions FileNotFoundException workaround
  • @Html implementation example
  • Debugging

Extensions

  • wdcossey/RazorEngineCore.Extensions
    • HTML values encoded by default (See issue #65 and @Raw)
    • Template precompiling
    • Direct model usage without RazorEngineTemplateBase
    cs
    template.Run(object model = null)
    template.RunAsync(object model = null)
    template.Run(TModel model = null)
    template.RunAsync(TModel model = null)

:boom: HTML Safety

RazorEngineCore is not HTML safe by default.
It can be easily turned on: see #65 and @Raw

Examples

Basic usage

cs
IRazorEngine razorEngine = new RazorEngine();
IRazorEngineCompiledTemplate template = razorEngine.Compile("Hello @Model.Name");

string result = template.Run(new
{
    Name = "Alexander"
});

Console.WriteLine(result);

Strongly typed model

cs
IRazorEngine razorEngine = new RazorEngine();
string templateText = "Hello @Model.Name";

// yeah, heavy definition
IRazorEngineCompiledTemplate> template = razorEngine.Compile>(templateText);

string result = template.Run(instance =>
{
    instance.Model = new TestModel()
    {
        Name = "Hello",
        Items = new[] {3, 1, 2}
    };
});

Console.WriteLine(result);

Debugging

Compile template with IncludeDebuggingInfo() option and call EnableDebugging() before running template. If template was compiled with IncludeDebuggingInfo() option, saving and loading will keep original template source code and pdb.

cs
IRazorEngineCompiledTemplate template2 = razorEngine.Compile(templateText, builder =>
{
    builder.IncludeDebuggingInfo();
});

template2.EnableDebugging(); // optional path to output directory

string result = template2.Run(new
{
    Title = "Welcome"
});

Place @{ Breakpoint(); } anywhere in template to stop at.

Save / Load compiled templates

Most expensive task is to compile template, you should not compile template every time you need to run it

cs
IRazorEngine razorEngine = new RazorEngine();
IRazorEngineCompiledTemplate template = razorEngine.Compile("Hello @Model.Name");

// save to file
template.SaveToFile("myTemplate.dll");

//save to stream
MemoryStream memoryStream = new MemoryStream();
template.SaveToStream(memoryStream);
cs
IRazorEngineCompiledTemplate template1 = RazorEngineCompiledTemplate.LoadFromFile("myTemplate.dll");
IRazorEngineCompiledTemplate template2 = RazorEngineCompiledTemplate.LoadFromStream(myStream);
cs
IRazorEngineCompiledTemplate template1 = RazorEngineCompiledTemplate.LoadFromFile("myTemplate.dll");
IRazorEngineCompiledTemplate template2 = RazorEngineCompiledTemplate.LoadFromStream(myStream);

Caching

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.

cs
private static ConcurrentDictionary TemplateCache = new ConcurrentDictionary();
cs
private string RenderTemplate(string template, object model)
{
    int hashCode = template.GetHashCode();

    IRazorEngineCompiledTemplate compiledTemplate = TemplateCache.GetOrAdd(hashCode, i =>
    {
        RazorEngine razorEngine = new RazorEngine();
        return razorEngine.Compile(Content);
    });

    return compiledTemplate.Run(model);
}

Or use RazorTemplateCache.cs

cs
static void CachedHtmlSafeExample()
{
	string result = RazorTemplateCache.RenderHtmlSafe("Hello 
@Model.Name
", new { Name = "Alex" });
	Console.WriteLine(result);
}

Template functions

ASP.NET Core way of defining template functions:


    @{ RecursionTest(3); }

@{
  void RecursionTest(int level)
  {
	if (level  template = razorEngine.Compile(content);

string result = template.Run(instance =>
{
    instance.A = 10;
    instance.B = "Alex";
});

Console.WriteLine(result);
cs
public class CustomTemplate : RazorEngineTemplateBase
{
    public int A { get; set; }
    public string B { get; set; }

    public string Decorator(object value)
    {
        return "-=" + value + "=-";
    }
}

Referencing assemblies

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.

cs
IRazorEngine razorEngine = new RazorEngine();
IRazorEngineCompiledTemplate 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" });

Credits

This package is inspired by Simon Mourier SO post

Changelog

  • 2026.1.1
    • NET10 target
    • RazorTemplateCache.cs in Example App * HtmlSafeTemplate.cs in Example App
  • 2024.4.1
    • Expose RazorProjectEngineBuilder #141 (thanks @cutslikeaknife)
    • Documentation for RazorEngineCompilationOptionsBuilder #140 (thanks @MichaelCleverdon)
    • More asyncs #138 (thanks @Adam Kauffman)
  • 2023.11.2
    • Virtual keyword fixed
  • 2023.11.1
    • Template debugging PR#111 (thanks @shehrozeee and @TheAtomicOption)
    • Add CancellationToken overloads to Compile methods PR#134 (thanks @daviddotcs) * Package license information #133 * Code cleanup
    • ⚠️ Breaking change for @Raw, update your code from wiki
  • 2022.8.1
    • Proper namespace handling for nested types and types without namespace #113 (thanks @Kirmiir)
  • 2022.7.6
    • Added the option to genereate pdb alongside the assembly which allows debugging the templates.
  • 2022.1.2
    • #94 publish as single file fix
  • 2022.1.1
    • Make private methods in RazorEngine protected and virtual #PR88 (thanks @wdcossey)
    • Dictionary bug in anonymous model #91 (thanks @jddj007-hydra)
    • Template name fix #PR84 (thanks @Yazwh0)
    • CI for GitHub Actions #PR69 (thanks @304NotModified)
    • Added Source Link #PR67 (thanks @304NotModified)
    • Microsoft.AspNetCore.Razor.Language 3.1.8 -> 6.0.1
    • Microsoft.CodeAnalysis.CSharp 3.7.0 -> 4.0.1
  • 2021.7.1
    • Better error messages #PR54 (thanks @wdcossey)
    • More asyncs #PR53 (thanks @wdcossey)
    • Strong name for assembly #59 (thanks @garryxiao)
  • 2021.3.1
    • fixed NET5 publish as single file (thanks @jddj007-hydra)
    • AnonymousTypeWrapper array handling fix
    • System.Collections referenced by default
    • Microsoft.AspNetCore.Razor.Language 3.1.8 -> 5.0.3
    • Microsoft.CodeAnalysis.CSharp 3.7.0 -> 3.8.0
  • 2020.10.1
    • Linux fix for #34
    • Microsoft.AspNetCore.Razor.Language 3.1.5 -> 3.1.8
    • Microsoft.CodeAnalysis.CSharp 3.6.0 -> 3.7.0
  • 2020.9.1
    • .NET 4.7.2 support (thanks @krmr)
  • 2020.6.1
    • Reference assemblies by Metadata (thanks @Merlin04)
    • Expose GeneratedCode in RazorEngineCompilationException
    • Microsoft.AspNetCore.Razor.Language 3.1.4 -> 3.1.5
  • 2020.5.2
    • IRazorEngineTemplate interface
    • RazorEngineTemplateBase methods go virtual
  • 2020.5.1
    • Async methods (thanks @wdcossey)
    • Microsoft.AspNetCore.Razor.Language 3.1.1 -> 3.1.4
    • Microsoft.CodeAnalysis.CSharp 3.4.0 -> 3.6.0
  • 2020.3.3
    • Model with generic type arguments compiling fix
  • 2020.3.2
    • External assembly referencing
    • Linq included by default
  • 2020.3.1
    • In attribute rendering fix #4
  • 2020.2.4
    • Null values in model correct handling
    • Null model fix
    • Netstandard2 insted of netcore3.1
  • 2020.2.3
    • Html attribute rendering fix
    • Html attribute rendering tests

Supported by

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

C#csharpdotnet-corenet5net6

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言