Plinth.Templating
1.5.0-b88.7a7c20cd
Prefix Reserved
See the version list below for details.
dotnet add package Plinth.Templating --version 1.5.0-b88.7a7c20cd
NuGet\Install-Package Plinth.Templating -Version 1.5.0-b88.7a7c20cd
<PackageReference Include="Plinth.Templating" Version="1.5.0-b88.7a7c20cd" />
<PackageVersion Include="Plinth.Templating" Version="1.5.0-b88.7a7c20cd" />
<PackageReference Include="Plinth.Templating" />
paket add Plinth.Templating --version 1.5.0-b88.7a7c20cd
#r "nuget: Plinth.Templating, 1.5.0-b88.7a7c20cd"
#addin nuget:?package=Plinth.Templating&version=1.5.0-b88.7a7c20cd&prerelease
#tool nuget:?package=Plinth.Templating&version=1.5.0-b88.7a7c20cd&prerelease
README
Plinth.Templating
HTML Templating library for generating emails and documents
1. Create an assembly with your cshtml templates in it, and some models
Directory structure example for a template assembly:
Templates/
Email1.cshtml
Email2.cshtml
Email3.cshtml
Layouts/
DefaultEmail.cshtml
Shared/
ButtonLink.cshtml
Models/
EmailModel.cs
2. Initialize the engine
var engine = new TemplateEngineBuilder()
.AddTemplateAssembly(typeof(EmailModel).Assembly, new[] { "Layouts", "Shared", "Templates" })
.PrecompileInBackground() // optional
.Build();
👉 the paths given are optional. If none are given then you must specify the full path from the assembly root
Example, with no paths, specify "Templates/Email1"
with "Templates"
specified, "Email1"
will work as well
👉 This goes for references in your code to templates, as well as Layouts, Partials, and IncludeAsync's
👉 The root of the assembly is always included
3. Set up templates
⚠️ NOTE! NOTE! NOTE! 👉 Make sure your cshtml files are set to "Embedded Resource" in your .csproj
@using MyAssembly.Models // using directives work just like c#
@inherits Plinth.Templating.Template<EmailModel> // do this to enable Include functionality
@inherits Plinth.Templating.Template // if not using a model
@model EmailModel // set up your model
@{ Layout = "DefaultEmail"; } // optionally, set up a Layout
@{ await IncludeAsync("ButtonLink", Model.Link); } // example of including another template
<p>@Model.Title</p> // example of using the model
<p>@ViewBag.Subtitle</p> // example of using the view bag
@functions { // static functions
public static int Double(int x) => x * 2;
}
@{ // local functions (can access model and viewbag)
int Double() => Model.Number * 2;
}
4. Render your templates
// no model
var result = await engine.RenderAsync("Email1");
// with model
var emailModel = new EmailModel { ... }
var result = await engine.RenderAsync("Email1", emailModel);
// with viewbag
dynamic viewbag = new ExpandoObject();
viewbag.Field1 = 7;
var result = await engine.RenderWithViewBagAsync("Email1", viewbag);
// with model and viewbag
var emailModel = new EmailModel { ... }
dynamic viewbag = new ExpandoObject();
viewbag.Field1 = 7;
var result = await engine.RenderWithViewBagAsync("Email1", emailModel, viewbag);
5. Rendering dynamic templates from strings
You can render a string template and cache it for later use, or for one time use
👉 These following are cached by "TemplateKey1", and re-rendering with that same key will ignore the string template subsequent renders
// no model
var result = await engine.RenderRawAsync("TemplateKey1", "<div>Hello</div>");
// with model
var emailModel = new EmailModel { ... }
var result = await engine.RenderRawAsync("TemplateKey1",
"<div>@Model.Name</div>", emailModel);
// with viewbag
dynamic viewbag = new ExpandoObject();
viewbag.Field1 = 7;
var result = await engine.RenderRawWithViewBagAsync("TemplateKey1",
"<div>@ViewBag.Field1</div>", viewbag);
// with model and viewbag
var emailModel = new EmailModel { ... }
dynamic viewbag = new ExpandoObject();
viewbag.Field1 = 7;
var result = await engine.RenderRawWithViewBagAsync("TemplateKey1",
"<div>@Model.Name, @ViewBag.Field1</div>", emailModel, viewbag);
👉 The following are one-offs and will re-compile every time
// no model
var result = await engine.RenderRawOnceAsync("<div>Hello</div>");
// with model
var emailModel = new EmailModel { ... }
var result = await engine.RenderRawOnceAsync("<div>@Model.Name</div>", emailModel);
// with viewbag
dynamic viewbag = new ExpandoObject();
viewbag.Field1 = 7;
var result = await engine.RenderRawOnceWithViewBagAsync(
"<div>@ViewBag.Field1</div>", viewbag);
// with model and viewbag
var emailModel = new EmailModel { ... }
dynamic viewbag = new ExpandoObject();
viewbag.Field1 = 7;
var result = await engine.RenderRawOnceWithViewBagAsync(
"<div>@Model.Name, @ViewBag.Field1</div>", emailModel, viewbag);
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 is compatible. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net6.0
- Microsoft.SourceLink.Bitbucket.Git (>= 1.1.1)
- Plinth.Common (>= 1.5.0-b88.7a7c20cd)
- RazorLight (>= 2.3.0)
-
net7.0
- Microsoft.SourceLink.Bitbucket.Git (>= 1.1.1)
- Plinth.Common (>= 1.5.0-b88.7a7c20cd)
- RazorLight (>= 2.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.7.2 | 404 | 3/16/2025 |
1.7.1 | 467 | 12/12/2024 |
1.7.0 | 226 | 11/12/2024 |
1.6.6 | 681 | 11/8/2024 |
1.6.5 | 2,100 | 8/31/2024 |
1.6.4 | 498 | 8/2/2024 |
1.6.3 | 611 | 5/15/2024 |
1.6.2 | 382 | 2/16/2024 |
1.6.1 | 4,405 | 1/5/2024 |
1.6.0 | 1,170 | 11/30/2023 |
1.5.10-b186.aca976b4 | 103 | 11/30/2023 |
1.5.9 | 172 | 11/29/2023 |
1.5.9-b174.64153841 | 243 | 11/23/2023 |
1.5.9-b172.dfc6e7bd | 212 | 11/17/2023 |
1.5.9-b171.4e2b92e2 | 381 | 11/4/2023 |
1.5.8 | 466 | 10/23/2023 |
1.5.7 | 7,486 | 7/31/2023 |
1.5.6 | 1,709 | 7/13/2023 |
1.5.5 | 219 | 6/29/2023 |
1.5.4 | 1,012 | 3/7/2023 |
1.5.3 | 287 | 3/3/2023 |
1.5.2 | 392 | 1/11/2023 |
1.5.2-b92.7c961f5f | 143 | 1/11/2023 |
1.5.0 | 557 | 11/9/2022 |
1.5.0-b88.7a7c20cd | 132 | 11/9/2022 |
1.4.7 | 2,343 | 10/20/2022 |
1.4.6 | 648 | 10/17/2022 |
1.4.5 | 664 | 10/1/2022 |
1.4.4 | 515 | 8/16/2022 |
1.4.3 | 481 | 8/2/2022 |
1.4.2 | 479 | 7/19/2022 |
1.4.2-b80.7fdbfd04 | 171 | 7/19/2022 |
1.4.2-b74.acaf86f5 | 161 | 6/15/2022 |
1.4.1 | 497 | 6/13/2022 |
1.4.0 | 481 | 6/6/2022 |
1.3.8 | 895 | 4/12/2022 |
1.3.7 | 562 | 3/21/2022 |
1.3.6 | 531 | 3/17/2022 |
1.3.6-b67.ca5053f3 | 176 | 3/16/2022 |
1.3.6-b66.4a9683e6 | 177 | 3/16/2022 |
1.3.5 | 518 | 2/23/2022 |
1.3.4 | 823 | 1/20/2022 |
1.3.3 | 401 | 12/29/2021 |
1.3.2 | 515 | 12/11/2021 |
1.3.1 | 429 | 11/12/2021 |
1.3.0 | 381 | 11/8/2021 |
1.2.3 | 1,576 | 9/22/2021 |
1.2.2 | 777 | 8/20/2021 |
1.2.1 | 781 | 8/5/2021 |
1.2.0 | 545 | 8/1/2021 |
1.2.0-b37.a54030b9 | 205 | 6/24/2021 |
1.1.6 | 1,889 | 3/22/2021 |
1.1.5 | 434 | 3/9/2021 |
1.1.4 | 560 | 2/27/2021 |
1.1.3 | 460 | 2/17/2021 |
1.1.2 | 430 | 2/12/2021 |
1.1.1 | 770 | 2/1/2021 |
1.1.0 | 566 | 12/16/2020 |
1.1.0-b27.b66c309b | 341 | 11/15/2020 |
1.0.12 | 1,236 | 10/18/2020 |
1.0.11 | 559 | 10/6/2020 |
1.0.10 | 514 | 9/30/2020 |
1.0.9 | 508 | 9/29/2020 |
1.0.8 | 724 | 9/26/2020 |
1.0.7 | 663 | 9/19/2020 |
1.0.6 | 552 | 9/3/2020 |
1.0.5 | 846 | 9/2/2020 |
1.0.4 | 749 | 9/1/2020 |
1.0.3 | 594 | 9/1/2020 |
1.0.2 | 607 | 8/29/2020 |
1.0.1 | 601 | 8/29/2020 |
1.0.0 | 578 | 8/29/2020 |
1.0.0-b1.c22f563d | 297 | 8/28/2020 |
net7.0 support and removed netcoreapp3.1