Skip to content

Commit

Permalink
Merge pull request #329 from chancie86/issue287
Browse files Browse the repository at this point in the history
Fixes #287: Layout not rendered when using await IncludeAsync using .NET Core 3
  • Loading branch information
jzabroski committed Mar 18, 2020
2 parents badbd17 + bdc918d commit f3a7041
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 36 deletions.
8 changes: 3 additions & 5 deletions src/RazorLight/EngineHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ public async Task<string> RenderTemplateAsync<T>(ITemplatePage templatePage, T m

using (var scope = new MemoryPoolViewBufferScope())
{
var renderer = new TemplateRenderer(templatePage, this, HtmlEncoder.Default, scope);
await renderer.RenderAsync().ConfigureAwait(false);
var renderer = new TemplateRenderer(this, HtmlEncoder.Default, scope);
await renderer.RenderAsync(templatePage).ConfigureAwait(false);
}
}

Expand All @@ -113,9 +113,7 @@ public async Task<string> RenderTemplateAsync<T>(ITemplatePage templatePage, T m
TemplateRenderer templateRenderer)
{
SetModelContext(templatePage, textWriter, model, viewBag);

templateRenderer.RazorPage = templatePage;
await templateRenderer.RenderAsync().ConfigureAwait(false);
await templateRenderer.RenderAsync(templatePage).ConfigureAwait(false);
}

/// <summary>
Expand Down
48 changes: 21 additions & 27 deletions src/RazorLight/TemplateRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,29 @@ public class TemplateRenderer
private readonly IEngineHandler _engineHandler;
private readonly IViewBufferScope _bufferScope;

public TemplateRenderer(
ITemplatePage razorPage,
public TemplateRenderer(
IEngineHandler engineHandler,
HtmlEncoder htmlEncoder,
IViewBufferScope bufferScope)
{
RazorPage = razorPage ?? throw new ArgumentNullException(nameof(razorPage));
{
_engineHandler = engineHandler ?? throw new ArgumentNullException(nameof(engineHandler));
_bufferScope = bufferScope ?? throw new ArgumentNullException(nameof(bufferScope));
_htmlEncoder = htmlEncoder ?? throw new ArgumentNullException(nameof(htmlEncoder));
}

/// <summary>
/// Gets <see cref="ITemplatePage"/> instance that the views executes on.
/// </summary>
public ITemplatePage RazorPage { get; set; }
///// <summary>
///// Gets the sequence of _ViewStart <see cref="ITemplatePage"/> instances that are executed by this view.
///// </summary>
//public IReadOnlyList<ITemplatePage> ViewStartPages { get; }

///// <summary>
///// Gets the sequence of _ViewStart <see cref="ITemplatePage"/> instances that are executed by this view.
///// </summary>
//public IReadOnlyList<ITemplatePage> ViewStartPages { get; }
/// <inheritdoc />
public virtual async Task RenderAsync(ITemplatePage page)
{
var context = page.PageContext;

/// <inheritdoc />
public virtual async Task RenderAsync()
{
var context = RazorPage.PageContext;

var bodyWriter = await RenderPageAsync(RazorPage, context, invokeViewStarts: false).ConfigureAwait(false);
await RenderLayoutAsync(context, bodyWriter).ConfigureAwait(false);
}
var bodyWriter = await RenderPageAsync(page, context, invokeViewStarts: false).ConfigureAwait(false);
await RenderLayoutAsync(page, context, bodyWriter).ConfigureAwait(false);
}

private async Task<ViewBufferTextWriter> RenderPageAsync(
ITemplatePage page,
Expand Down Expand Up @@ -151,14 +144,15 @@ private Task RenderViewStartsAsync(PageContext context)
//}
}

private async Task RenderLayoutAsync(
private async Task RenderLayoutAsync(
ITemplatePage page,
PageContext context,
ViewBufferTextWriter bodyWriter)
{
// A layout page can specify another layout page. We'll need to continue
// looking for layout pages until they're no longer specified.
var previousPage = RazorPage;
var renderedLayouts = new List<ITemplatePage>();
ViewBufferTextWriter bodyWriter)
{
// A layout page can specify another layout page. We'll need to continue
// looking for layout pages until they're no longer specified.
var previousPage = page;
var renderedLayouts = new List<ITemplatePage>();

// This loop will execute Layout pages from the inside to the outside. With each
// iteration, bodyWriter is replaced with the aggregate of all the "body" content
Expand Down
8 changes: 4 additions & 4 deletions tests/RazorLight.Tests/TemplateRendererTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public async Task Ensure_PrerenderCallbacks_Are_Invoked()
engineMock.SetupGet(e => e.Options).Returns(options);

//Act
var templateRenderer = new TemplateRenderer(page, engineMock.Object, HtmlEncoder.Default, new MemoryPoolViewBufferScope());
await templateRenderer.RenderAsync();
var templateRenderer = new TemplateRenderer(engineMock.Object, HtmlEncoder.Default, new MemoryPoolViewBufferScope());
await templateRenderer.RenderAsync(page);

//Assert
Assert.True(triggered1);
Expand Down Expand Up @@ -84,8 +84,8 @@ public async Task Template_Shares_Context_With_Layout()
using (var writer = new StringWriter())
{
page.PageContext.Writer = writer;
var renderer = new TemplateRenderer(page, engineMock.Object, encoder, new MemoryPoolViewBufferScope());
await renderer.RenderAsync();
var renderer = new TemplateRenderer(engineMock.Object, encoder, new MemoryPoolViewBufferScope());
await renderer.RenderAsync(page);

output = writer.ToString();
}
Expand Down

0 comments on commit f3a7041

Please sign in to comment.