在 C# 中将 IHtmlContent/TagBuilder 转换为字符串
Convert IHtmlContent/TagBuilder to string in C#
我正在使用 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 转换为字符串?
如果您只需要将内容输出为字符串,只需添加此方法并将您的 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 将处理所有转义业务。
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();
}
}
我正在使用 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 转换为字符串?
如果您只需要将内容输出为字符串,只需添加此方法并将您的 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 视图中,我们甚至不再需要 - 根据下面的 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 将处理所有转义业务。
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();
}
}