diff --git a/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeBuilder.cs b/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeBuilder.cs
index e9d36b6c81..1969876988 100644
--- a/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeBuilder.cs
+++ b/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeBuilder.cs
@@ -102,8 +102,20 @@ namespace Microsoft.AspNetCore.Blazor.RenderTree
/// The value of the attribute.
public void AddAttribute(int sequence, string name, object value)
{
- AssertCanAddAttribute();
- Append(RenderTreeNode.Attribute(sequence, name, value.ToString()));
+ if (_lastNonAttributeNodeType == RenderTreeNodeType.Element)
+ {
+ // Element attribute values can only be strings or UIEventHandler
+ Append(RenderTreeNode.Attribute(sequence, name, value.ToString()));
+ }
+ else if (_lastNonAttributeNodeType == RenderTreeNodeType.Component)
+ {
+ Append(RenderTreeNode.Attribute(sequence, name, value));
+ }
+ else
+ {
+ // This is going to throw. Calling it just to get a consistent exception message.
+ AssertCanAddAttribute();
+ }
}
///
diff --git a/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeNode.cs b/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeNode.cs
index d6351209b9..89399caadb 100644
--- a/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeNode.cs
+++ b/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderTreeNode.cs
@@ -106,6 +106,14 @@ namespace Microsoft.AspNetCore.Blazor.RenderTree
AttributeValue = value
};
+ internal static RenderTreeNode Attribute(int sequence, string name, object value) => new RenderTreeNode
+ {
+ Sequence = sequence,
+ NodeType = RenderTreeNodeType.Attribute,
+ AttributeName = name,
+ AttributeValue = value
+ };
+
internal static RenderTreeNode ChildComponent(int sequence) where T: IComponent => new RenderTreeNode
{
Sequence = sequence,
diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffComputerTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffComputerTest.cs
index 0dd403a544..f341aa7e07 100644
--- a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffComputerTest.cs
+++ b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffComputerTest.cs
@@ -684,9 +684,9 @@ namespace Microsoft.AspNetCore.Blazor.Test
var diff = new RenderTreeDiffComputer(renderer);
var testObject = new object();
newTree.OpenComponentElement(0);
- //newTree.AddAttribute(1, nameof(FakeComponent.IntProperty), 123);
+ newTree.AddAttribute(1, nameof(FakeComponent.IntProperty), 123);
newTree.AddAttribute(2, nameof(FakeComponent.StringProperty), "some string");
- //newTree.AddAttribute(3, nameof(FakeComponent.ObjectProperty), testObject);
+ newTree.AddAttribute(3, nameof(FakeComponent.ObjectProperty), testObject);
newTree.CloseElement();
// Act
@@ -696,9 +696,9 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Assert
AssertEdit(result.Edits.Single(), RenderTreeEditType.PrependNode, 0);
Assert.NotNull(componentInstance);
- //Assert.Equal(123, componentInstance.IntProperty);
+ Assert.Equal(123, componentInstance.IntProperty);
Assert.Equal("some string", componentInstance.StringProperty);
- //Assert.Same(testObject, componentInstance.ObjectProperty);
+ Assert.Same(testObject, componentInstance.ObjectProperty);
}
[Fact]