/// 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 {