zoa*_*oaz 21 c# asp.net asp.net-core-mvc asp.net-core
我正在使用ASP.NET 5.我需要将IHtmlContent转换为String
IIHtmlContent是ASP.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.手动输出文本可能不是必需的.
dev*_*ric 24
加上上面的答案:
由于删除HtmlEncoder了Microsoft.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)
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将负责所有逃避业务.
| 归档时间: |
|
| 查看次数: |
13016 次 |
| 最近记录: |