Skip to content

Commit bd6df18

Browse files
committed
Added Include functionality
1 parent ac716fd commit bd6df18

File tree

6 files changed

+69
-3
lines changed

6 files changed

+69
-3
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,30 @@ For intellisense to work it's recommended you add the following to the top of yo
3030
@inherits RazorLight.TemplatePage<MyModelType>
3131
```
3232

33+
or:
34+
35+
```cshtml
36+
@inherits RazorRenderer.BasePage<MyModelType>
37+
```
38+
39+
The latter will opt you into functionality added to this library (see below).
40+
41+
## Including a sub-file
42+
43+
The RazorLight `Include` functionality has been disabled since it uses a magic string and this library aims to avoid runtime dynamic functionality, however, there is an include functionality that you can use. If you extend from `RazorRenderer.BasePage<TModel>` from the parent page and the child page:
44+
45+
```cshtml
46+
@inherits RazorRenderer.BasePage<MyModelType>
47+
```
48+
49+
Then in your parent file you can include another page using:
50+
51+
```cshtml
52+
@{ Include<SubPage, MyModelType>(new MyModelType()); }
53+
```
54+
55+
Where `SubPage` is the typename generated for the included page.
56+
3357
## Ignoring generated files from source control
3458

3559
It's recommended that you add `*.cshtml.cs` to your `.gitignore` file so that you don't commit the generated files. That avoids superfluous diff/commit noise.

RazorRenderer/BasePage.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using RazorLight;
2+
3+
namespace RazorRenderer
4+
{
5+
public abstract class BasePage<TModel> : TemplatePage<TModel>
6+
{
7+
protected void Include<TIncludedPage, TIncludedPageModel>(TIncludedPageModel model)
8+
where TIncludedPage : BasePage<TIncludedPageModel>, new()
9+
{
10+
var newPage = new TIncludedPage();
11+
TemplateFileRenderer.RenderIncludedTemplateAsync(this, newPage, model).GetAwaiter().GetResult();
12+
}
13+
}
14+
}

RazorRenderer/TemplateFileRenderer.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ public async static Task<string> RenderTemplateAsync<T>(ITemplatePage templatePa
2323
}
2424
}
2525

26+
public static async Task RenderIncludedTemplateAsync<T>(ITemplatePage parentPage, BasePage<T> includedTemplatePage, T model)
27+
{
28+
using (var scope = new MemoryPoolViewBufferScope())
29+
{
30+
var renderer = new TemplateRenderer(Handler, HtmlEncoder.Default, scope);
31+
SetModelContext(includedTemplatePage, parentPage.PageContext.Writer, model, parentPage.PageContext.ViewBag);
32+
await renderer.RenderAsync(includedTemplatePage).ConfigureAwait(false);
33+
}
34+
}
35+
2636
private async static Task RenderTemplateAsync<T>(
2737
ITemplatePage templatePage,
2838
T model,
@@ -38,7 +48,7 @@ private async static Task RenderTemplateAsync<T>(
3848
await renderer.RenderAsync(templatePage).ConfigureAwait(false);
3949
}
4050
}
41-
51+
4252
private static void SetModelContext<T>(
4353
ITemplatePage templatePage,
4454
TextWriter textWriter,

Test/ModelType.cshtml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
1-
@inherits RazorLight.TemplatePage<object>
2-
<p>@Model.GetType()</p>
1+
@using Test
2+
@inherits RazorRenderer.BasePage<object>
3+
<p>@Model.GetType(): @Model</p>
4+
@{ Include<SubPage, object>("xyz"); }
5+
6+
<p>After include</p>

Test/Program.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,24 @@ class Program
77
{
88
static void Main(string[] args)
99
{
10+
WriteMagenta("date.cshtml");
1011
Console.WriteLine(new Date().Render((object) null));
12+
WriteMagenta("ModelType.cshtml > 1");
1113
Console.WriteLine(new ModelType().Render(1));
14+
WriteMagenta("ModelType.cshtml > 'a'");
1215
Console.WriteLine(new ModelType().Render("a"));
16+
WriteMagenta("Subfolder/date.cshtml");
1317
Console.WriteLine(new Subfolder.Date().Render((object)null));
18+
WriteMagenta("Subfolder/SubSubFolder/date.cshtml");
1419
Console.WriteLine(new Subfolder.SubSubFolder.Date().Render((object)null));
1520
Console.ReadLine();
1621
}
22+
23+
static void WriteMagenta(string write)
24+
{
25+
Console.ForegroundColor = ConsoleColor.Magenta;
26+
Console.WriteLine(write);
27+
Console.ResetColor();
28+
}
1729
}
1830
}

Test/SubPage.cshtml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
@inherits RazorRenderer.BasePage<object>
2+
<p>@Model.GetType(): @Model</p>

0 commit comments

Comments
 (0)