Razor.Templating.Core
2.1.0
dotnet add package Razor.Templating.Core --version 2.1.0
NuGet\Install-Package Razor.Templating.Core -Version 2.1.0
<PackageReference Include="Razor.Templating.Core" Version="2.1.0" />
paket add Razor.Templating.Core --version 2.1.0
#r "nuget: Razor.Templating.Core, 2.1.0"
// Install Razor.Templating.Core as a Cake Addin #addin nuget:?package=Razor.Templating.Core&version=2.1.0 // Install Razor.Templating.Core as a Cake Tool #tool nuget:?package=Razor.Templating.Core&version=2.1.0
Razor.Templating.Core
Using Razor for HTML templating was never been so easy like this. Render your .cshtml files into string easily using this library.
This project makes use of Razor SDK for precompiling the views.
Supported Application Types
.NET Core 3 to .NET 5 | .NET 6 & Above | |
---|---|---|
Preferred Version | v1.6.0 | 2.1.0 |
Console | ✓ | ✓ |
Api | ✓ | ✓ |
Mvc | ✓ | ✓ |
Worker Service | ✓ | ✓ |
WPF | ✓ | ✓ |
WinForms | ✓ | ✓ |
Azure Functions | ✓ | ✓ |
Supported View Features
MVC Razor View Features | |
---|---|
ViewModel | ✓ |
ViewBag | ✓ |
ViewData | ✓ |
Layouts | ✓ |
ViewStarts | ✓ |
ViewImports | ✓ |
Partial Views | ✓ |
Tag Helpers | ✓ |
View Components (.NET 5 +) | ✓ |
View Localization (Only MVC) | ✓ |
Dependency Injection into Views | ✓ |
@Url.ContentUrl** | ✗ |
@Url.RouteUrl** | ✗ |
**Contributors are welcome who can help to enable these unsupported features.
Applications
- Email Templating
- Report Generation & more
Installing Nuget Package
This library is available as Nuget package
Using .NET CLI
dotnet add package Razor.Templating.Core
Using Package Reference .csproj
<PackageReference Include="Razor.Templating.Core" Version="2.1.0" />
Usage - Render View With Layout
To render a view with layout, model, viewdata or viewbag, then call the RenderAsync()
on the RazorTemplateEngine
static class
RenderAsync() method
using Razor.Templating.Core;
var model = new ExampleModel()
{
PlainText = "This text is rendered from Razor Views using Razor.Templating.Core",
HtmlContent = "<em>You can use it to generate email content, report generation and so on</em>"
};
// Both ViewBag and ViewData should be added to the same dictionary.
var viewDataOrViewBag = new Dictionary<string, object>();
// ViewData is same as mvc
viewDataOrViewBag["Value1"] = "1";
// ViewBag.Value2 can be written as below. There's no change on how it's accessed in .cshtml file
viewDataOrViewBag["Value2"] = "2";
var html = await RazorTemplateEngine.RenderAsync("/Views/ExampleView.cshtml", model, viewDataOrViewBag);
Before applying this code, follow this article for sample implementation: https://medium.com/@soundaranbu/render-razor-view-cshtml-to-string-in-net-core-7d125f32c79
Render View Without Layout
In case if there's a need to render a view without layout, use RenderParitalAsync()
method.
RenderPartialAsync() method
var html = await RazorTemplateEngine.RenderPartialAsync("/Views/ExampleView.cshtml", model, viewDataOrViewBag);
Render Views Without Throwing Exception
There are TryRenderAsync()
and TryRenderPartialAsync
methods which will not throw exception if the view doesn't exist.
Instead they return a tuple to indicate whether the view exists and the rendered string.
TryRenderAsync() method
var (viewExists, renderedView) = await engine.TryRenderAsync("~/Views/Feature/ExampleViewWithoutViewModel.cshtml");
TryRenderPartialAsync() method
var (viewExists, renderedView) = await engine.TryRenderPartialAsync("~/Views/_ExamplePartialView.cshtml", model);
Razor Views in Library
We can organize the Razor view files(.cshtml) in a separate shared Razor Class Libary(RCL). Please find a sample library here
The Razor Class Library's .csproj
file should look something like below. Whereas, AddRazorSupportForMvc
property is mandatory.
Also, RCL should be referenced by the main project or where any of the rendering methods like RazorTemplateEngine.RenderAsync()
are invoked.
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
Dependency Injection
Dependencies can be injected directly into views using @inject
in .csthml file. Refer sample application here
In ASP.NET Core, add dependency like below in Startup.cs -> ConfigureServices
...
services.AddTransient<ExampleService>();
//add after registering all the dependencies
services.AddRazorTemplating();
or in console or other applications, add as below
using Microsoft.Extensions.DependencyInjection;
// Add dependencies to the service collection
var services = new ServiceCollection();
services.AddTransient<ExampleService>();
// Add RazorTemplating after registering all dependencies
// this is important for the razor template engine to find the injected services
services.AddRazorTemplating();
Once the dependencies are registered, we can use either one of these ways:
Using RazorTemplateEngine
static class
var html = await RazorTemplateEngine.RenderAsync("~/Views/ExampleViewServiceInjection.cshtml");
Using IRazorTemplateEngine
- Instead of using the
RazorTemplateEngine
static class, it's also possible to use theIRazorTemplateEngine
interface to inject dependency directly into the constructor.
public class MyService {
private readonly IRazorTemplateEngine _razorTemplateEngine;
public MyService (IRazorTemplateEngine razorTemplateEngine)
{
_razorTemplateEngine = razorTemplateEngine;
}
public async Task Index()
{
var renderedView = await _razorTemplateEngine.RenderAsync("/Views/Home/Index.cshtml");
// do something with renderedView
}
}
How to render razor views from absolute path
We can make use of ASP.NET Core's inbuilt RazorRuntimeCompilation to render any .cshtml inside or outside of the project.
As of v1.7.0+
, we can achieve this as below:
using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Razor.Templating.Core;
var services = new ServiceCollection();
services.AddMvcCore().AddRazorRuntimeCompilation();
services.Configure<MvcRazorRuntimeCompilationOptions>(opts =>
{
opts.FileProviders.Add(new PhysicalFileProvider(@"D:\PathToRazorViews")); // This will be the root path
});
services.AddRazorTemplating();
var html = await RazorTemplateEngine.RenderAsync("/Views/Home/Rcl.cshtml"); // relative path to the root
Please note this may become slightly better in the future versions of our library.
Note:
- Please ensure that the views path is always unique among all the shared template projects.
Sample Applications
Please find the sample applications here
Support
If you find this helpful, consider supporting the development of this library by sponsoring one or more coffee ;) Thanks!
References:
Thanks to all the great articles and projects which helped to bring this library out!
- https://github.com/Andy9FromSpace/razor-renderer-core
- https://github.com/aspnet/Entropy/tree/master/samples/Mvc.RenderViewToString
- https://www.frakkingsweet.com/razor-template-rendering/
- https://github.com/veccsolutions/RenderRazorConsole
- https://emilol.com/razor-mailer/
- https://codeopinion.com/using-razor-in-a-console-application/
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- No dependencies.
NuGet packages (18)
Showing the top 5 NuGet packages that depend on Razor.Templating.Core:
Package | Downloads |
---|---|
Sitko.Core.App.Web
Sitko.Core is a set of libraries to help build .NET Core applications fast |
|
FenixAlliance.ACL.Dependencies
Application Component for the Alliance Business Suite. |
|
Bnsights.Core
Package Description |
|
Digizuite.Optimizely
The official integration between Digizuite DAM and Optimizely CMS. |
|
VjnFramework
Core Framework vjn |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on Razor.Templating.Core:
Repository | Stars |
---|---|
LANCommander/LANCommander
|
|
sitkoru/Sitko.Core
Sitko.Core is a set of libraries to help build .NET Core applications fast
|
Version | Downloads | Last updated | |
---|---|---|---|
2.1.0 | 33,860 | 10/14/2024 | |
2.1.0-rc.1 | 447 | 9/12/2024 | |
2.0.0 | 289,364 | 4/18/2024 | |
2.0.0-rc.1 | 2,598 | 3/4/2024 | |
1.9.0 | 617,892 | 8/25/2023 | |
1.9.0-rc.2 | 96,095 | 2/25/2023 | |
1.9.0-rc.1 | 176,893 | 11/13/2022 | |
1.8.0 | 1,051,442 | 11/5/2022 | |
1.8.0-rc.1 | 6,827 | 9/17/2022 | |
1.7.1 | 515,567 | 7/2/2022 | |
1.7.1-rc.1 | 14,178 | 2/20/2022 | |
1.7.0 | 752,458 | 11/13/2021 | |
1.7.0-preview.1 | 2,203 | 9/26/2021 | |
1.6.1-rc.1 | 5,873 | 1/13/2022 | |
1.6.0 | 445,684 | 9/26/2021 | |
1.6.0-rc.2 | 7,552 | 5/14/2021 | |
1.6.0-rc.1 | 786 | 5/13/2021 | |
1.5.0 | 410,839 | 2/27/2021 | |
1.4.0 | 104,030 | 12/5/2020 | |
1.4.0-rc.1 | 655 | 11/19/2020 | |
1.3.0 | 8,709 | 11/17/2020 | |
1.2.1 | 35,100 | 9/21/2020 | |
1.2.0 | 3,772 | 7/11/2020 | |
1.1.2 | 2,915 | 4/13/2020 | |
1.1.0 | 924 | 4/13/2020 | |
1.0.1 | 982 | 4/3/2020 | |
1.0.0 | 1,241 | 4/3/2020 |
- Fixed an issue in the MVC application where views were not being discovered in the same controller’s view location. Now, if the controller is HomeController and the view file Index.cshtml is located under Views/Home/Index.cshtml, the library can render the view from HomeController simply by passing Index as the view name. Previously, it was necessary to pass the full relative URL Views/Home/Index.cshtml. This functionality is available only when IRazorTemplateEngine is utilized through Dependency Injection (DI). For applications that are not MVC-based, this view discovery method will not work, and the library will revert to the default behavior, which requires the full relative path of the view file
- Adds support for MVC View localization