parent
9aff0a67c1
commit
9d38e2523c
|
|
@ -298,37 +298,69 @@ namespace Microsoft.AspNetCore.Mvc.Rendering
|
||||||
throw new ArgumentNullException(nameof(encoder));
|
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:
|
case TagRenderMode.StartTag:
|
||||||
writer.Write("<");
|
writer.Write("<");
|
||||||
writer.Write(TagName);
|
writer.Write(tagBuilder.TagName);
|
||||||
AppendAttributes(writer, encoder);
|
tagBuilder.AppendAttributes(writer, encoder);
|
||||||
writer.Write(">");
|
writer.Write(">");
|
||||||
break;
|
break;
|
||||||
case TagRenderMode.EndTag:
|
case TagRenderMode.EndTag:
|
||||||
writer.Write("</");
|
writer.Write("</");
|
||||||
writer.Write(TagName);
|
writer.Write(tagBuilder.TagName);
|
||||||
writer.Write(">");
|
writer.Write(">");
|
||||||
break;
|
break;
|
||||||
case TagRenderMode.SelfClosing:
|
case TagRenderMode.SelfClosing:
|
||||||
writer.Write("<");
|
writer.Write("<");
|
||||||
writer.Write(TagName);
|
writer.Write(tagBuilder.TagName);
|
||||||
AppendAttributes(writer, encoder);
|
tagBuilder.AppendAttributes(writer, encoder);
|
||||||
writer.Write(" />");
|
writer.Write(" />");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
writer.Write("<");
|
writer.Write("<");
|
||||||
writer.Write(TagName);
|
writer.Write(tagBuilder.TagName);
|
||||||
AppendAttributes(writer, encoder);
|
tagBuilder.AppendAttributes(writer, encoder);
|
||||||
writer.Write(">");
|
writer.Write(">");
|
||||||
if (_innerHtml != null)
|
if (tagBuilder._innerHtml != null)
|
||||||
{
|
{
|
||||||
_innerHtml.WriteTo(writer, encoder);
|
tagBuilder._innerHtml.WriteTo(writer, encoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.Write("</");
|
writer.Write("</");
|
||||||
writer.Write(TagName);
|
writer.Write(tagBuilder.TagName);
|
||||||
writer.Write(">");
|
writer.Write(">");
|
||||||
break;
|
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
|
private static class Html401IdUtil
|
||||||
{
|
{
|
||||||
public static bool IsAsciiLetter(char testChar)
|
public static bool IsAsciiLetter(char testChar)
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
using Microsoft.AspNetCore.Mvc.TestCommon;
|
||||||
using Microsoft.Extensions.WebEncoders.Testing;
|
using Microsoft.Extensions.WebEncoders.Testing;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -169,5 +170,89 @@ namespace Microsoft.AspNetCore.Mvc.Core.Rendering
|
||||||
Assert.False(tagBuilder.HasInnerHtml);
|
Assert.False(tagBuilder.HasInnerHtml);
|
||||||
Assert.NotNull(innerHtml);
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue