我正在使用ASP.NET 5.我需要将IHtmlContent转换为String
IIHtmlContent
是ASP.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转换为字符串?
答案 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;
}
最后在剃刀视图中,我们甚至不再需要 - 基于Lukáš无效Kmoch评论如下:@Html.Raw(Html.GetContent())
(以前在ASP.NET MVC 5中需要)ASP.NET MVC 5 has type MvcHtmlString. You don't need to use Html.Raw()
只需拨打@Html.GetContent()
即可,Razor将负责所有逃避业务。
答案 3 :(得分:0)
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();
}
}