2015-11-12 38 views
9

我使用ASP.NET 5.我需要IHtmlContent转换为字符串转换IHtmlContent/TagBuilder字符串在C#中

IIHtmlContentASP.NET 5Microsoft.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为字符串的方法?

+0

'ToHtmlString'怎么样?另外,你从哪里获得IHtmlContent? –

+1

我指的是'HtmlString'类的方法。你能把我指向“IHtmlContent”的文档吗?它似乎没有在MSDN上 –

回答

12

如果你需要做的是输出的内容作为一个字符串,只需添加此方法并传入你的IHtmlContent对象作为参数,以获得字符串输出:

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

你可能要重新考虑你为什么我们正在采用这种方法,因为TagBuilder允许您考虑任何类型的自定义HTML。手动输出文本可能不是必需的。

+0

好的答案..这就是我一直在寻找的东西。 – d234

+4

不适用于asp.vnext核心。改为使用'HtmlEncoder.Default' – NucS

12

添加到上面的答案:

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

通行证HtmlEncoder.Default的方法,它会工作

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

ASP.NET核心实际上是引入了精心优化屈指可数。如果你正在建立一个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; 
} 

终于在Razor视图,我们甚至不需要@Html.Raw(Html.GetContent())了(它使用在ASP.NET中需要MVC 5),只需拨打@Html.GetContent()就足够了,Razor将负责所有的转义业务。