Add methods to TagBuilder (#6287)

Addresses #5689
This commit is contained in:
Jass Bagga 2017-05-19 12:23:16 -07:00 committed by GitHub
parent 9aff0a67c1
commit 9d38e2523c
2 changed files with 146 additions and 12 deletions

View File

@ -298,37 +298,69 @@ namespace Microsoft.AspNetCore.Mvc.Rendering
throw new ArgumentNullException(nameof(encoder));
}
switch (TagRenderMode)
WriteTo(this, writer, encoder, TagRenderMode);
}
/// <summary>
/// Returns an <see cref="IHtmlContent"/> that renders the body.
/// </summary>
/// <returns>An <see cref="IHtmlContent"/> that renders the body.</returns>
public IHtmlContent RenderBody() => _innerHtml;
/// <summary>
/// Returns an <see cref="IHtmlContent"/> that renders the start tag.
/// </summary>
/// <returns>An <see cref="IHtmlContent"/> that renders the start tag.</returns>
public IHtmlContent RenderStartTag() => new RenderTagHtmlContent(this, TagRenderMode.StartTag);
/// <summary>
/// Returns an <see cref="IHtmlContent"/> that renders the end tag.
/// </summary>
/// <returns>An <see cref="IHtmlContent"/> that renders the end tag.</returns>
public IHtmlContent RenderEndTag() => new RenderTagHtmlContent(this, TagRenderMode.EndTag);
/// <summary>
/// Returns an <see cref="IHtmlContent"/> that renders the self-closing tag.
/// </summary>
/// <returns>An <see cref="IHtmlContent"/> that renders the self-closing tag.</returns>
public IHtmlContent RenderSelfClosingTag() => new RenderTagHtmlContent(this, TagRenderMode.SelfClosing);
private static void WriteTo(
TagBuilder tagBuilder,
TextWriter writer,
HtmlEncoder encoder,
TagRenderMode tagRenderMode)
{
switch (tagRenderMode)
{
case TagRenderMode.StartTag:
writer.Write("<");
writer.Write(TagName);
AppendAttributes(writer, encoder);
writer.Write(tagBuilder.TagName);
tagBuilder.AppendAttributes(writer, encoder);
writer.Write(">");
break;
case TagRenderMode.EndTag:
writer.Write("</");
writer.Write(TagName);
writer.Write(tagBuilder.TagName);
writer.Write(">");
break;
case TagRenderMode.SelfClosing:
writer.Write("<");
writer.Write(TagName);
AppendAttributes(writer, encoder);
writer.Write(tagBuilder.TagName);
tagBuilder.AppendAttributes(writer, encoder);
writer.Write(" />");
break;
default:
writer.Write("<");
writer.Write(TagName);
AppendAttributes(writer, encoder);
writer.Write(tagBuilder.TagName);
tagBuilder.AppendAttributes(writer, encoder);
writer.Write(">");
if (_innerHtml != null)
if (tagBuilder._innerHtml != null)
{
_innerHtml.WriteTo(writer, encoder);
tagBuilder._innerHtml.WriteTo(writer, encoder);
}
writer.Write("</");
writer.Write(TagName);
writer.Write(tagBuilder.TagName);
writer.Write(">");
break;
}
@ -343,6 +375,23 @@ namespace Microsoft.AspNetCore.Mvc.Rendering
}
}
private class RenderTagHtmlContent : IHtmlContent
{
private readonly TagBuilder _tagBuilder;
private readonly TagRenderMode _tagRenderMode;
public RenderTagHtmlContent(TagBuilder tagBuilder, TagRenderMode tagRenderMode)
{
_tagBuilder = tagBuilder;
_tagRenderMode = tagRenderMode;
}
public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
TagBuilder.WriteTo(_tagBuilder, writer, encoder, _tagRenderMode);
}
}
private static class Html401IdUtil
{
public static bool IsAsciiLetter(char testChar)

View File

@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TestCommon;
using Microsoft.Extensions.WebEncoders.Testing;
using Xunit;
@ -169,5 +170,89 @@ namespace Microsoft.AspNetCore.Mvc.Core.Rendering
Assert.False(tagBuilder.HasInnerHtml);
Assert.NotNull(innerHtml);
}
[Fact]
public void RenderStartTag_RendersExpectedStartTag()
{
// Arrange
var tagBuilder = new TagBuilder("p");
// Act
var tag = tagBuilder.RenderStartTag();
// Assert
Assert.Equal("<p>", HtmlContentUtilities.HtmlContentToString(tag));
}
[Fact]
public void RenderStartTag_RendersExpectedStartTag_TagBuilderRendersAsExpected()
{
// Arrange
var tagBuilder = new TagBuilder("p");
tagBuilder.TagRenderMode = TagRenderMode.EndTag;
// Act
var tag = tagBuilder.RenderStartTag();
// Assert
Assert.Equal("<p>", HtmlContentUtilities.HtmlContentToString(tag));
Assert.Equal("</p>", HtmlContentUtilities.HtmlContentToString(tagBuilder));
}
[Fact]
public void RenderEndTag_RendersExpectedEndTag()
{
// Arrange
var tagBuilder = new TagBuilder("p");
// Act
var tag = tagBuilder.RenderEndTag();
// Assert
Assert.Equal("</p>", HtmlContentUtilities.HtmlContentToString(tag));
}
[Fact]
public void RenderEndTag_RendersExpectedEndTag_TagBuilderRendersAsExpected()
{
// Arrange
var tagBuilder = new TagBuilder("p");
tagBuilder.TagRenderMode = TagRenderMode.Normal;
// Act
var tag = tagBuilder.RenderEndTag();
// Assert
Assert.Equal("</p>", HtmlContentUtilities.HtmlContentToString(tag));
Assert.Equal("<p></p>", HtmlContentUtilities.HtmlContentToString(tagBuilder));
}
[Fact]
public void RenderSelfClosingTag_RendersExpectedSelfClosingTag()
{
// Arrange
var tagBuilder = new TagBuilder("p");
// Act
var tag = tagBuilder.RenderSelfClosingTag();
// Assert
Assert.Equal("<p />", HtmlContentUtilities.HtmlContentToString(tag));
}
[Fact]
public void RenderBody_RendersExpectedBody()
{
// Arrange
var tagBuilder = new TagBuilder("p");
tagBuilder.InnerHtml.AppendHtml("<span>Hello</span>");
// Act
var tag = tagBuilder.RenderBody();
// Assert
Assert.Equal("<span>Hello</span>", HtmlContentUtilities.HtmlContentToString(tag));
}
}
}