diff --git a/src/Microsoft.Blazor/RenderTree/RenderTreeBuilder.cs b/src/Microsoft.Blazor/RenderTree/RenderTreeBuilder.cs index e04b9e2bd4..6b4d4db6dc 100644 --- a/src/Microsoft.Blazor/RenderTree/RenderTreeBuilder.cs +++ b/src/Microsoft.Blazor/RenderTree/RenderTreeBuilder.cs @@ -59,6 +59,13 @@ namespace Microsoft.Blazor.RenderTree public void AddText(string textContent) => Append(RenderTreeNode.Text(textContent)); + /// + /// Appends a node representing text content. + /// + /// Content for the new text node. + public void AddText(object textContent) + => AddText(textContent?.ToString()); + /// /// Appends a node representing a string-valued attribute. /// The attribute is associated with the most recently added element. diff --git a/src/Microsoft.Blazor/RenderTree/RenderTreeNode.cs b/src/Microsoft.Blazor/RenderTree/RenderTreeNode.cs index c27819c3a8..cb6f55f8bb 100644 --- a/src/Microsoft.Blazor/RenderTree/RenderTreeNode.cs +++ b/src/Microsoft.Blazor/RenderTree/RenderTreeNode.cs @@ -77,7 +77,7 @@ namespace Microsoft.Blazor.RenderTree internal static RenderTreeNode Text(string textContent) => new RenderTreeNode { NodeType = RenderTreeNodeType.Text, - TextContent = textContent, + TextContent = textContent ?? string.Empty, }; internal static RenderTreeNode Attribute(string name, string value) => new RenderTreeNode diff --git a/test/Microsoft.Blazor.Build.Test/RazorCompilerTest.cs b/test/Microsoft.Blazor.Build.Test/RazorCompilerTest.cs index 17a4ce6310..ec4113e53a 100644 --- a/test/Microsoft.Blazor.Build.Test/RazorCompilerTest.cs +++ b/test/Microsoft.Blazor.Build.Test/RazorCompilerTest.cs @@ -100,6 +100,25 @@ namespace Microsoft.Blazor.Build.Test node => AssertNode.Text(node, "Some plain text")); } + [Fact] + public void SupportsCSharpExpressions() + { + // Arrange/Act + var component = CompileToComponent(@" + @(""Hello"") + @((object)null) + @(123) + @(new object()) + "); + + // Assert + var nodes = GetRenderTree(component).Where(NotWhitespace); + Assert.Collection(nodes, + node => AssertNode.Text(node, "Hello"), + node => AssertNode.Text(node, "123"), + node => AssertNode.Text(node, new object().ToString())); + } + [Fact] public void SupportsCSharpFunctionsBlock() { diff --git a/test/Microsoft.Blazor.Test/RenderTreeBuilderTest.cs b/test/Microsoft.Blazor.Test/RenderTreeBuilderTest.cs index ab9fe21bec..1cc0228812 100644 --- a/test/Microsoft.Blazor.Test/RenderTreeBuilderTest.cs +++ b/test/Microsoft.Blazor.Test/RenderTreeBuilderTest.cs @@ -40,9 +40,11 @@ namespace Microsoft.Blazor.Test { // Arrange var builder = new RenderTreeBuilder(new TestRenderer()); + var nullString = (string)null; // Act builder.AddText("First item"); + builder.AddText(nullString); builder.AddText("Second item"); // Assert @@ -50,9 +52,29 @@ namespace Microsoft.Blazor.Test Assert.Equal(0, nodes.Offset); Assert.Collection(nodes, node => AssertNode.Text(node, "First item"), + node => AssertNode.Text(node, string.Empty), node => AssertNode.Text(node, "Second item")); } + [Fact] + public void CanAddNonStringValueAsText() + { + // Arrange + var builder = new RenderTreeBuilder(new TestRenderer()); + var nullObject = (object)null; + + // Act + builder.AddText(1234); + builder.AddText(nullObject); + + // Assert + var nodes = builder.GetNodes(); + Assert.Equal(0, nodes.Offset); + Assert.Collection(nodes, + node => AssertNode.Text(node, "1234"), + node => AssertNode.Text(node, string.Empty)); + } + [Fact] public void UnclosedElementsHaveNoEndDescendantIndex() { diff --git a/test/testapps/BasicTestApp/CounterComponent.cshtml b/test/testapps/BasicTestApp/CounterComponent.cshtml index f82015a4aa..194eb1419b 100644 --- a/test/testapps/BasicTestApp/CounterComponent.cshtml +++ b/test/testapps/BasicTestApp/CounterComponent.cshtml @@ -1,5 +1,5 @@ 

Counter

-

Current count: @currentCount.ToString()

+

Current count: @currentCount

@functions {