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

zoa*_*oaz 21 c# asp.net asp.net-core-mvc asp.net-core

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

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

简化我有以下方法

public static IHtmlContent GetContent()
{
    return new HtmlString("<tag>blah</tag>");
}
Run Code Online (Sandbox Code Playgroud)

当我参考它

string output = GetContent().ToString();
Run Code Online (Sandbox Code Playgroud)

我得到GetContent()的以下输出

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 
Run Code Online (Sandbox Code Playgroud)

并不是

<tag>blah</tag>
Run Code Online (Sandbox Code Playgroud)

我想要的

我也尝试过使用StringBuilder

StringBuilder html = new StringBuilder();
html.Append(GetContent());
Run Code Online (Sandbox Code Playgroud)

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

我试着把它投射到TagBuilder

TagBuilder content = (TagBuilder)GetContent();
Run Code Online (Sandbox Code Playgroud)

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

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

cyg*_*nim 28

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

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

您可能想重新考虑为什么采用这种方法,因为TagBuilder允许您可以想到的任何类型的自定义HTML.手动输出文本可能不是必需的.

  • 不适用于asp.vnext核心.使用`HtmlEncoder.Default`代替 (12认同)
  • 不应该将StringWriter包裹在using块中吗? (2认同)

dev*_*ric 24

加上上面的答案:

由于删除HtmlEncoderMicrosoft.Extensions.WebEncoders命名空间并且新HtmlEncoder类被移动到新的命名空间System.Text.Encodings.Web,因此新的实例在ASP.NET Core RTM中不起作用,但此类现在被编写为抽象和密封类,因此您无法创建来自它的新实例或派生类.

传递HtmlEncoder.Default给方法,它会工作

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


vul*_*ven 9

ASP.NET Core实际上引入了一些谨慎的优化.如果要构建HTML扩展方法,那么最有效的方法是避免使用字符串:

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;
}
Run Code Online (Sandbox Code Playgroud)

最后在剃刀视图中,我们甚至@Html.Raw(Html.GetContent())不再需要(曾经在ASP.NET MVC 5中需要),只需调用即可ASP.NET MVC 5 has type MvcHtmlString. You don't need to use Html.Raw(),Razor将负责所有逃避业务.