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

时间:2015-11-12 08:41:05

标签: c# asp.net asp.net-core asp.net-core-mvc

我正在使用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转换为字符串?

4 个答案:

答案 0 :(得分:23)

添加上面的答案:

HtmlEncoder的新实例在ASP.NET Core RTM中不起作用,因为删除了Microsoft.Extensions.WebEncoders命名空间并将新的HtmlEncoder类移动到新的命名空间{{ 1}},但是这个类现在被写成一个抽象的密封类,因此你不能从中创建一个新的实例或派生类。

System.Text.Encodings.Web传递给方法,它将起作用

HtmlEncoder.Default

答案 1 :(得分:22)

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

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

答案 2 :(得分:9)

ASP.NET Core实际上引入了一些谨慎的优化。如果要构建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;
}

最后在剃刀视图中,我们甚至不再需要@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将负责所有逃避业务。

答案 3 :(得分:0)

有一个样本: 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();
            }
        }