在 C# 中将 IHtmlContent/TagBuilder 转换为字符串

Convert IHtmlContent/TagBuilder to string in C#

我正在使用 ASP.NET 5. 我需要将 IHtmlContent 转换为 String

IIHtmlContentASP.NET 5 Microsoft.AspNet.Html.Abstractions 命名空间的一部分,并且是 TagBuilder 实现的接口

简化我有以下方法

public static IHtmlContent GetContent()
{
    return new HtmlString("<tag>blah</tag>");
}

当我引用它时

string output = GetContent().ToString();

我得到 GetContent() 的以下输出

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

而不是

<tag>blah</tag>

我想要的

我也试过使用 StringBuilder

StringBuilder html = new StringBuilder();
html.Append(GetContent());

但它还会附加相同的命名空间而不是字符串值

我尝试将其转换为 TagBuilder

TagBuilder content = (TagBuilder)GetContent();

但 TagBuilder 没有转换为字符串的方法

如何将 IHtmlContent 或 TagBuilder 转换为字符串?

如果您只需要将内容输出为字符串,只需添加此方法并将您的 IHtmlContent 对象作为参数传递即可获取字符串输出:

public static string GetString(IHtmlContent content)
{
    using (var writer = new System.IO.StringWriter())
    {        
        content.WriteTo(writer, HtmlEncoder.Default);
        return writer.ToString();
    } 
}     

添加到上面的答案:

HtmlEncoder 的新实例在 ASP.NET Core RTM 中不起作用,因为 Microsoft.Extensions.WebEncoders 命名空间已被删除,新的 HtmlEncoder class被移动到一个新的命名空间 System.Text.Encodings.Web,但是这个 class 现在被写成一个抽象和密封的 class 所以你不能创建一个新的实例或派生的 class它。

HtmlEncoder.Default 传递给该方法,它将起作用

public static string GetString(IHtmlContent content)
{
    var writer = new System.IO.StringWriter();
    content.WriteTo(writer, HtmlEncoder.Default);
    return writer.ToString();
}

ASP.NET 核心实际上引入了一些仔细的优化。如果您正在构建 HTML 扩展方法,那么最有效的方法是避免使用 string:

public static IHtmlContent GetContent(this IHtmlHelper helper)
{
    var content = new HtmlContentBuilder()
                     .AppendHtml("<ol class='content-body'><li>")
                     .AppendHtml(helper.ActionLink("Home", "Index", "Home"))
                     .AppendHtml("</li>");

    if(SomeCondition())
    {
        content.AppendHtml(@"<div>
            Note `HtmlContentBuilder.AppendHtml()` is Mutable
            as well as Fluent/Chainable.
        </div>");
    }

    return content;
}

终于在 razor 视图中,我们甚至不再需要 @Html.Raw(Html.GetContent())(这在 ASP.NET MVC 5 中曾经是必需的) - 根据下面的 Lukáš Kmoch 评论无效:ASP.NET MVC 5 has type MvcHtmlString. You don't need to use Html.Raw()

只需调用 @Html.GetContent() 就足够了,Razor 将处理所有转义业务。

有一个例子: https://github.com/aspnet/Mvc/blob/release/2.2/test/Microsoft.AspNetCore.Mvc.Views.TestCommon/HtmlContentUtilities.cs

public static string HtmlContentToString(IHtmlContent content, HtmlEncoder encoder = null)
        {
            if (encoder == null)
            {
                encoder = new HtmlTestEncoder();
            }

            using (var writer = new StringWriter())
            {
                content.WriteTo(writer, encoder);
                return writer.ToString();
            }
        }

这是一个扩展方法,因此您可以像 ToString() 一样使用它。

    public static string ToHtmlString(this IHtmlContent content)
    {
        if (content is HtmlString htmlString)
        {
            return htmlString.Value;
        }

        using (var writer = new StringWriter())
        {
            content.WriteTo(writer, HtmlEncoder.Default);
            return writer.ToString();
        }
    }