diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs
index 8578b6993e..dc26b140b0 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs
@@ -156,6 +156,20 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
// later.
_foundNonHtml = true;
}
+ else if (string.Equals("option", node.TagName, StringComparison.OrdinalIgnoreCase))
+ {
+ // Also, treat as non-HTML - we don't want it to be coalesced so that we can support setting "selected" attribute on it.
+ // We only care about option tags that are nested under a select tag.
+ foreach (var ancestor in Ancestors)
+ {
+ if (ancestor is MarkupElementIntermediateNode element &&
+ string.Equals("select", element.TagName, StringComparison.OrdinalIgnoreCase))
+ {
+ _foundNonHtml = true;
+ break;
+ }
+ }
+ }
base.VisitDefault(node);
diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs
index 75c32a7878..ca9885009a 100644
--- a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs
+++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Components/ComponentMarkupBlockPassTest.cs
@@ -306,6 +306,65 @@ namespace Microsoft.AspNetCore.Razor.Language.Components
Assert.Empty(documentNode.FindDescendantNodes());
}
+ [Fact]
+ public void Execute_CannotRewriteHtml_SelectOption()
+ {
+ // Arrange
+ var document = CreateDocument(@"
+
+ @if (some_bool)
+ {
+
+
+
+ }
+");
+
+ var documentNode = Lower(document);
+
+ // Act
+ Pass.Execute(document, documentNode);
+
+ // Assert
+ Assert.Empty(documentNode.FindDescendantNodes());
+ }
+
+ [Fact]
+ public void Execute_CanRewriteHtml_OptionWithNoSelectAncestor()
+ {
+ // Arrange
+ var document = CreateDocument(@"
+
+ @if (some_bool)
+ {
+
+
+
+
+ }
+");
+
+ var expected = NormalizeContent(@"
+
+
+
+
+");
+
+ var documentNode = Lower(document);
+
+ // Act
+ Pass.Execute(document, documentNode);
+
+ // Assert
+ var block = documentNode.FindDescendantNodes().Single();
+ Assert.Equal(expected, block.Content, ignoreLineEndingDifferences: true);
+ }
+
// The unclosed tag will have errors, so we won't rewrite it or its parent.
[Fact]
public void Execute_CannotRewriteHtml_Errors()