From c9c8e802a7ead380fcc60c6c7baa5924e8713db8 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 13 Apr 2015 12:22:25 -0700 Subject: [PATCH] Add PreElement and PostElement to TagHelperOutput. - These two new properties will enable TagHelper authors to render content before and after the TagHelper's HTML element. - Added tests to correspond with existing test coverage. - Modified existing tests to double check for TagHelperOutput.Pre/PostElement. - Refactored all DefaultTagHelperContent pieces of TagHelperOutput to be get only properties. #341 --- .../TagHelpers/TagHelperOutput.cs | 49 +++++++------------ .../TagHelpers/TagHelperOutputTest.cs | 48 +++++++++++++++++- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperOutput.cs b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperOutput.cs index 6da8128e25..0d6d0d33e6 100644 --- a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperOutput.cs +++ b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperOutput.cs @@ -12,10 +12,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers /// public class TagHelperOutput { - private readonly DefaultTagHelperContent _preContent; - private readonly DefaultTagHelperContent _content; - private readonly DefaultTagHelperContent _postContent; - // Internal for testing internal TagHelperOutput(string tagName) : this(tagName, new Dictionary(StringComparer.OrdinalIgnoreCase)) @@ -33,9 +29,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { TagName = tagName; Attributes = new Dictionary(attributes, StringComparer.OrdinalIgnoreCase); - _preContent = new DefaultTagHelperContent(); - _content = new DefaultTagHelperContent(); - _postContent = new DefaultTagHelperContent(); } /// @@ -46,42 +39,36 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers /// public string TagName { get; set; } + /// + /// Content that precedes the HTML element. + /// + /// Value is rendered before the HTML element. + public TagHelperContent PreElement { get; } = new DefaultTagHelperContent(); + /// /// The HTML element's pre content. /// /// Value is prepended to the 's final output. - public TagHelperContent PreContent - { - get - { - return _preContent; - } - } + public TagHelperContent PreContent { get; } = new DefaultTagHelperContent(); /// /// The HTML element's main content. /// /// Value occurs in the 's final output after and /// before - public TagHelperContent Content - { - get - { - return _content; - } - } + public TagHelperContent Content { get; } = new DefaultTagHelperContent(); /// /// The HTML element's post content. /// /// Value is appended to the 's final output. - public TagHelperContent PostContent - { - get - { - return _postContent; - } - } + public TagHelperContent PostContent { get; } = new DefaultTagHelperContent(); + + /// + /// Content that follows the HTML element. + /// + /// Value is rendered after the HTML element. + public TagHelperContent PostElement { get; } = new DefaultTagHelperContent(); /// /// true if has been set, false otherwise. @@ -113,15 +100,17 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers /// Changes to generate nothing. /// /// - /// Sets to null, and clears , , - /// and to suppress output. + /// Sets to null, and clears , , + /// , , and to suppress output. /// public void SuppressOutput() { TagName = null; + PreElement.Clear(); PreContent.Clear(); Content.Clear(); PostContent.Clear(); + PostElement.Clear(); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperOutputTest.cs b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperOutputTest.cs index f100c90fe0..39d7912f13 100644 --- a/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperOutputTest.cs +++ b/test/Microsoft.AspNet.Razor.Runtime.Test/TagHelpers/TagHelperOutputTest.cs @@ -8,6 +8,38 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers { public class TagHelperOutputTest { + [Fact] + public void PreElement_SetContent_ChangesValue() + { + // Arrange + var tagHelperOutput = new TagHelperOutput("p"); + tagHelperOutput.PreElement.SetContent("Hello World"); + + // Act & Assert + Assert.NotNull(tagHelperOutput.PreElement); + Assert.NotNull(tagHelperOutput.PreContent); + Assert.NotNull(tagHelperOutput.Content); + Assert.NotNull(tagHelperOutput.PostContent); + Assert.NotNull(tagHelperOutput.PostElement); + Assert.Equal("Hello World", tagHelperOutput.PreElement.GetContent()); + } + + [Fact] + public void PostElement_SetContent_ChangesValue() + { + // Arrange + var tagHelperOutput = new TagHelperOutput("p"); + tagHelperOutput.PostElement.SetContent("Hello World"); + + // Act & Assert + Assert.NotNull(tagHelperOutput.PreElement); + Assert.NotNull(tagHelperOutput.PreContent); + Assert.NotNull(tagHelperOutput.Content); + Assert.NotNull(tagHelperOutput.PostContent); + Assert.NotNull(tagHelperOutput.PostElement); + Assert.Equal("Hello World", tagHelperOutput.PostElement.GetContent()); + } + [Fact] public void TagName_CanSetToNullInCtor() { @@ -39,9 +71,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers tagHelperOutput.PreContent.SetContent("Hello World"); // Act & Assert + Assert.NotNull(tagHelperOutput.PreElement); Assert.NotNull(tagHelperOutput.PreContent); Assert.NotNull(tagHelperOutput.Content); Assert.NotNull(tagHelperOutput.PostContent); + Assert.NotNull(tagHelperOutput.PostElement); Assert.Equal("Hello World", tagHelperOutput.PreContent.GetContent()); } @@ -53,9 +87,11 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers tagHelperOutput.Content.SetContent("Hello World"); // Act & Assert + Assert.NotNull(tagHelperOutput.PreElement); Assert.NotNull(tagHelperOutput.PreContent); Assert.NotNull(tagHelperOutput.Content); Assert.NotNull(tagHelperOutput.PostContent); + Assert.NotNull(tagHelperOutput.PostElement); Assert.Equal("Hello World", tagHelperOutput.Content.GetContent()); } @@ -67,14 +103,16 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers tagHelperOutput.PostContent.SetContent("Hello World"); // Act & Assert + Assert.NotNull(tagHelperOutput.PreElement); Assert.NotNull(tagHelperOutput.PreContent); Assert.NotNull(tagHelperOutput.Content); Assert.NotNull(tagHelperOutput.PostContent); + Assert.NotNull(tagHelperOutput.PostElement); Assert.Equal("Hello World", tagHelperOutput.PostContent.GetContent()); } [Fact] - public void SuppressOutput_Sets_TagName_Content_PreContent_PostContent_ToNull() + public void SuppressOutput_Sets_AllContent_ToNullOrEmpty() { // Arrange var tagHelperOutput = new TagHelperOutput("p"); @@ -87,12 +125,16 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers // Assert Assert.Null(tagHelperOutput.TagName); + Assert.NotNull(tagHelperOutput.PreElement); + Assert.Empty(tagHelperOutput.PreElement.GetContent()); Assert.NotNull(tagHelperOutput.PreContent); Assert.Empty(tagHelperOutput.PreContent.GetContent()); Assert.NotNull(tagHelperOutput.Content); Assert.Empty(tagHelperOutput.Content.GetContent()); Assert.NotNull(tagHelperOutput.PostContent); Assert.Empty(tagHelperOutput.PostContent.GetContent()); + Assert.NotNull(tagHelperOutput.PostElement); + Assert.Empty(tagHelperOutput.PostElement.GetContent()); } [Fact] @@ -113,12 +155,16 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers tagHelperOutput.SuppressOutput(); // Assert + Assert.NotNull(tagHelperOutput.PreElement); + Assert.Empty(tagHelperOutput.PreElement.GetContent()); Assert.NotNull(tagHelperOutput.PreContent); Assert.Empty(tagHelperOutput.PreContent.GetContent()); Assert.NotNull(tagHelperOutput.Content); Assert.Empty(tagHelperOutput.Content.GetContent()); Assert.NotNull(tagHelperOutput.PostContent); Assert.Empty(tagHelperOutput.PostContent.GetContent()); + Assert.NotNull(tagHelperOutput.PostElement); + Assert.Empty(tagHelperOutput.PostElement.GetContent()); } [Theory]