Add TagBuilder copy constructor (#10955) (#22729)

Co-authored-by: Filip Staffa <git@filipstaffa.net>
This commit is contained in:
Filip Staffa 2020-06-23 00:43:25 +02:00 committed by GitHub
parent 827751ffe1
commit 94941438d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 88 additions and 0 deletions

View File

@ -652,6 +652,7 @@ namespace Microsoft.AspNetCore.Mvc.Rendering
[System.Diagnostics.DebuggerDisplayAttribute("{DebuggerToString()}")]
public partial class TagBuilder : Microsoft.AspNetCore.Html.IHtmlContent
{
public TagBuilder(Microsoft.AspNetCore.Mvc.Rendering.TagBuilder tagBuilder) { }
public TagBuilder(string tagName) { }
public Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary Attributes { get { throw null; } }
public bool HasInnerHtml { get { throw null; } }

View File

@ -37,6 +37,34 @@ namespace Microsoft.AspNetCore.Mvc.Rendering
TagName = tagName;
}
/// <summary>
/// Creates a copy of the HTML tag passed as <paramref name="tagBuilder"/>.
/// </summary>
/// <param name="tagBuilder">Tag to copy.</param>
public TagBuilder(TagBuilder tagBuilder)
{
if (tagBuilder == null)
{
throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(tagBuilder));
}
if (tagBuilder._attributes != null)
{
foreach (var tag in tagBuilder._attributes)
{
Attributes.Add(tag);
}
}
if (tagBuilder._innerHtml != null)
{
tagBuilder.InnerHtml.CopyTo(InnerHtml);
}
TagName = tagBuilder.TagName;
TagRenderMode = tagBuilder.TagRenderMode;
}
/// <summary>
/// Gets the set of attributes that will be written to the tag.
/// </summary>

View File

@ -253,5 +253,64 @@ namespace Microsoft.AspNetCore.Mvc.Core.Rendering
// Assert
Assert.Equal("<span>Hello</span>", HtmlContentUtilities.HtmlContentToString(tag));
}
[Fact]
public void Constructor_Copy_CopiesTagRenderMode()
{
// Arrange
var originalTagBuilder = new TagBuilder("p");
originalTagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
// Act
var clonedTagBuilder = new TagBuilder(originalTagBuilder);
// Assert
Assert.Equal(originalTagBuilder.TagRenderMode, clonedTagBuilder.TagRenderMode);
}
[Fact]
public void Constructor_Copy_DoesShallowCopyOfInnerHtml()
{
// Arrange
var originalTagBuilder = new TagBuilder("p");
originalTagBuilder.InnerHtml.AppendHtml("<span>Hello</span>");
// Act
var clonedTagBuilder = new TagBuilder(originalTagBuilder);
// Assert
Assert.NotEqual(originalTagBuilder.InnerHtml, clonedTagBuilder.InnerHtml);
Assert.Equal(HtmlContentUtilities.HtmlContentToString(originalTagBuilder.RenderBody()), HtmlContentUtilities.HtmlContentToString(clonedTagBuilder.RenderBody()));
}
[Fact]
public void Constructor_Copy_DoesShallowCopyOfAttributes()
{
// Arrange
var originalTagBuilder = new TagBuilder("p");
originalTagBuilder.AddCssClass("class1");
// Act
var clonedTagBuilder = new TagBuilder(originalTagBuilder);
// Assert
Assert.NotSame(originalTagBuilder.Attributes, clonedTagBuilder.Attributes);
Assert.Equal(originalTagBuilder.Attributes, clonedTagBuilder.Attributes);
}
[Fact]
public void Constructor_Copy_CopiesTagName()
{
// Arrange
var originalTagBuilder = new TagBuilder("p");
// Act
var clonedTagBuilder = new TagBuilder(originalTagBuilder);
// Assert
Assert.Equal(originalTagBuilder.TagName, clonedTagBuilder.TagName);
}
}
}