Fix rendering inheritance. Fixes #8192 (#8818)

* Make it irrelevant whether components call base.BuildRenderTree or not. Fixes #8192

* Remove base.BuildRenderTree calls from manually-implemented render logic

* Update ref assembly code
This commit is contained in:
Steve Sanderson 2019-03-27 21:26:13 +00:00 committed by GitHub
parent cc1b2941f9
commit 63a4b5c27a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 9 additions and 26 deletions

View File

@ -577,7 +577,6 @@ namespace Test
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
for (var i = 0; i < Count; i++)
{
builder.AddContent(i, Template, Value);

View File

@ -65,7 +65,6 @@ namespace Microsoft.AspNetCore.Components
}
public abstract partial class ComponentBase : Microsoft.AspNetCore.Components.IComponent, Microsoft.AspNetCore.Components.IHandleAfterRender, Microsoft.AspNetCore.Components.IHandleEvent
{
public const string BuildRenderTreeMethodName = "BuildRenderTree";
public ComponentBase() { }
protected virtual void BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder builder) { }
protected System.Threading.Tasks.Task Invoke(System.Action workItem) { throw null; }

View File

@ -25,11 +25,6 @@ namespace Microsoft.AspNetCore.Components
/// </summary>
public abstract class ComponentBase : IComponent, IHandleEvent, IHandleAfterRender
{
/// <summary>
/// Specifies the name of the <see cref="RenderTree"/>-building method.
/// </summary>
public const string BuildRenderTreeMethodName = nameof(BuildRenderTree);
private readonly RenderFragment _renderFragment;
private RenderHandle _renderHandle;
private bool _initialized;
@ -41,7 +36,12 @@ namespace Microsoft.AspNetCore.Components
/// </summary>
public ComponentBase()
{
_renderFragment = BuildRenderTree;
_renderFragment = builder =>
{
_hasPendingQueuedRender = false;
_hasNeverRendered = false;
BuildRenderTree(builder);
};
}
/// <summary>
@ -52,8 +52,9 @@ namespace Microsoft.AspNetCore.Components
{
// Developers can either override this method in derived classes, or can use Razor
// syntax to define a derived class and have the compiler generate the method.
_hasPendingQueuedRender = false;
_hasNeverRendered = false;
// Other code within this class should *not* invoke BuildRenderTree directly,
// but instead should invoke the _renderFragment field.
}
/// <summary>

View File

@ -93,8 +93,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
// If _fixedEditContext changes, tear down and recreate all descendants.
// This is so we can safely use the IsFixed optimization on CascadingValue,
// optimizing for the common case where _fixedEditContext never changes.

View File

@ -23,7 +23,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "input");
builder.AddAttribute(1, "type", "checkbox");
builder.AddAttribute(2, "id", Id);

View File

@ -22,7 +22,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "input");
builder.AddAttribute(1, "type", "date");
builder.AddAttribute(2, "id", Id);

View File

@ -61,7 +61,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "input");
builder.AddAttribute(1, "type", "number");
builder.AddAttribute(2, "step", _stepAttributeValue);

View File

@ -19,7 +19,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "select");
builder.AddAttribute(1, "id", Id);
builder.AddAttribute(2, "class", CssClass);

View File

@ -24,7 +24,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "input");
builder.AddAttribute(1, "id", Id);
builder.AddAttribute(2, "class", CssClass);

View File

@ -24,7 +24,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "textarea");
builder.AddAttribute(1, "id", Id);
builder.AddAttribute(2, "class", CssClass);

View File

@ -64,8 +64,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
foreach (var message in CurrentEditContext.GetValidationMessages(_fieldIdentifier))
{
builder.OpenElement(0, "div");

View File

@ -49,8 +49,6 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
// As an optimization, only evaluate the messages enumerable once, and
// only produce the enclosing <ul> if there's at least one message
var messagesEnumerator = CurrentEditContext.GetValidationMessages().GetEnumerator();

View File

@ -380,7 +380,6 @@ namespace Microsoft.AspNetCore.Components.Test
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "p");
builder.AddContent(1, Counter);
builder.CloseElement();

View File

@ -3655,7 +3655,6 @@ namespace Microsoft.AspNetCore.Components.Test
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
var renderFactory = WhatToRender[TestId];
renderFactory(this)(builder);
}

View File

@ -482,7 +482,6 @@ namespace Microsoft.AspNetCore.Components.Rendering
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "p");
builder.AddContent(1, Value.ToString());
builder.CloseElement();
@ -513,7 +512,6 @@ namespace Microsoft.AspNetCore.Components.Rendering
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "p");
builder.AddContent(1, Value.ToString());
builder.CloseElement();