From 3940ca8b606e0dd5b3ec229d6caaa047d3f62e03 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Fri, 26 Jan 2018 09:54:35 -0800 Subject: [PATCH] For components, allow attribute values to be arbitrary objects --- .../RenderTree/RenderTreeBuilder.cs | 16 ++++++++++++++-- .../RenderTree/RenderTreeNode.cs | 8 ++++++++ .../RenderTreeDiffComputerTest.cs | 8 ++++---- 3 files changed, 26 insertions(+), 6 deletions(-) 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]