Skip to content

Commit 6421295

Browse files
committed
[Blazor] Prevent HtmlRenderer from calling OnAfterRender by default
1 parent c76cb92 commit 6421295

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed

src/Components/Components/src/Rendering/HtmlRenderer.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics;
7-
using System.Runtime.CompilerServices;
87
using System.Runtime.ExceptionServices;
8+
using System.Threading;
99
using System.Threading.Tasks;
1010
using Microsoft.AspNetCore.Components.RenderTree;
1111
using Microsoft.Extensions.Logging;
@@ -22,6 +22,8 @@ public class HtmlRenderer : Renderer
2222
"area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"
2323
};
2424

25+
private static readonly Task CancelledRenderTask = Task.FromCanceled(new CancellationToken(canceled: true));
26+
2527
private readonly Func<string, string> _htmlEncoder;
2628

2729
/// <summary>
@@ -41,7 +43,13 @@ public HtmlRenderer(IServiceProvider serviceProvider, ILoggerFactory loggerFacto
4143
/// <inheritdoc />
4244
protected override Task UpdateDisplayAsync(in RenderBatch renderBatch)
4345
{
44-
return Task.CompletedTask;
46+
// By default we return a cancelled task. This has the effect of making it so that the
47+
// OnAfterRenderAsync callbacks on components don't run by default.
48+
// This way, by default prerendering gets the correct behavior and other renderers
49+
// override the UpdateDisplayAsync method already, so those components can cancel
50+
// either complete a task when the client acknowledges the render, or a cancelled task
51+
// when the renderer gets disposed.
52+
return CancelledRenderTask;
4553
}
4654

4755
/// <summary>

src/Components/Web.JS/dist/Release/blazor.server.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Mvc/Mvc.ViewFeatures/test/HtmlHelperComponentExtensionsTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,26 @@ public async Task CanRender_ComponentWithParametersObject()
5959
Assert.Equal("<p>Hello Steve!</p>", content);
6060
}
6161

62+
[Fact]
63+
public async Task RenderComponent_DoesNotInvokeOnAfterRenderInComponent()
64+
{
65+
// Arrange
66+
var helper = CreateHelper();
67+
var writer = new StringWriter();
68+
69+
// Act
70+
var state = new State();
71+
var result = await helper.RenderStaticComponentAsync<OnAfterRenderComponent>(new
72+
{
73+
State = state
74+
});
75+
result.WriteTo(writer, HtmlEncoder.Default);
76+
77+
// Assert
78+
Assert.Equal("<p>Hello</p>", writer.ToString());
79+
Assert.False(state.Value);
80+
}
81+
6282
[Fact]
6383
public async Task CanCatch_ComponentWithSynchronousException()
6484
{
@@ -310,6 +330,26 @@ protected override async Task OnParametersSetAsync()
310330
}
311331
}
312332

333+
private class OnAfterRenderComponent : ComponentBase
334+
{
335+
[Parameter] public State State { get; set; }
336+
337+
protected override void OnAfterRender()
338+
{
339+
State.Value = true;
340+
}
341+
342+
protected override void BuildRenderTree(RenderTreeBuilder builder)
343+
{
344+
builder.AddMarkupContent(0, "<p>Hello</p>");
345+
}
346+
}
347+
348+
private class State
349+
{
350+
public bool Value { get; set; }
351+
}
352+
313353
private class GreetingComponent : ComponentBase
314354
{
315355
[Parameter] public string Name { get; set; }

0 commit comments

Comments
 (0)