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
This commit is contained in:
N. Taylor Mullen 2015-04-13 12:22:25 -07:00
parent 9722319762
commit c9c8e802a7
2 changed files with 66 additions and 31 deletions

View File

@ -12,10 +12,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
/// </summary>
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<string, object>(StringComparer.OrdinalIgnoreCase))
@ -33,9 +29,6 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
{
TagName = tagName;
Attributes = new Dictionary<string, object>(attributes, StringComparer.OrdinalIgnoreCase);
_preContent = new DefaultTagHelperContent();
_content = new DefaultTagHelperContent();
_postContent = new DefaultTagHelperContent();
}
/// <summary>
@ -46,42 +39,36 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
/// </remarks>
public string TagName { get; set; }
/// <summary>
/// Content that precedes the HTML element.
/// </summary>
/// <remarks>Value is rendered before the HTML element.</remarks>
public TagHelperContent PreElement { get; } = new DefaultTagHelperContent();
/// <summary>
/// The HTML element's pre content.
/// </summary>
/// <remarks>Value is prepended to the <see cref="ITagHelper"/>'s final output.</remarks>
public TagHelperContent PreContent
{
get
{
return _preContent;
}
}
public TagHelperContent PreContent { get; } = new DefaultTagHelperContent();
/// <summary>
/// The HTML element's main content.
/// </summary>
/// <remarks>Value occurs in the <see cref="ITagHelper"/>'s final output after <see cref="PreContent"/> and
/// before <see cref="PostContent"/></remarks>
public TagHelperContent Content
{
get
{
return _content;
}
}
public TagHelperContent Content { get; } = new DefaultTagHelperContent();
/// <summary>
/// The HTML element's post content.
/// </summary>
/// <remarks>Value is appended to the <see cref="ITagHelper"/>'s final output.</remarks>
public TagHelperContent PostContent
{
get
{
return _postContent;
}
}
public TagHelperContent PostContent { get; } = new DefaultTagHelperContent();
/// <summary>
/// Content that follows the HTML element.
/// </summary>
/// <remarks>Value is rendered after the HTML element.</remarks>
public TagHelperContent PostElement { get; } = new DefaultTagHelperContent();
/// <summary>
/// <c>true</c> if <see cref="Content"/> has been set, <c>false</c> otherwise.
@ -113,15 +100,17 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
/// Changes <see cref="TagHelperOutput"/> to generate nothing.
/// </summary>
/// <remarks>
/// Sets <see cref="TagName"/> to <c>null</c>, and clears <see cref="PreContent"/>, <see cref="Content"/>,
/// and <see cref="PostContent"/> to suppress output.
/// Sets <see cref="TagName"/> to <c>null</c>, and clears <see cref="PreElement"/>, <see cref="PreContent"/>,
/// <see cref="Content"/>, <see cref="PostContent"/>, and <see cref="PostElement"/> to suppress output.
/// </remarks>
public void SuppressOutput()
{
TagName = null;
PreElement.Clear();
PreContent.Clear();
Content.Clear();
PostContent.Clear();
PostElement.Clear();
}
}
}

View File

@ -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]