ASP.NET 渲染时核心不应在 TagBuilder 中编码属性值 Json+Ld 脚本
ASP.NET Core should not encode attribute value in TagBuilder when rendering Json+Ld script
我写了一个 HtmlHelper 扩展来渲染 Json+Ld 脚本标签。
我向你求助的原因是,类型属性值“application/ld+json”被编码,看起来像“application/ld+json”,我可以找到一个解决方案。
我的 HtmlHelper 的 C# 代码:
public static IHtmlContent GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
{
//if(string.IsNullOrEmpty(innerText))
// return HtmlString.Empty;
var tag = new TagBuilder("script");
tag.MergeAttribute("type", "application/ld+json");
tag.InnerHtml.AppendHtml(innerText);
tag.TagRenderMode = TagRenderMode.Normal;
return tag;
}
在我看来,我使用 Html 分机,所以:
@Html.GetJsonLdScriptTag("")
Html 输出为:
<script type="application/ld+json"></script>
我尝试使用 HtmlDecode(...) 和 returning Html.Raw 进行解码(...);, 但没有成功。
另一个尝试是 return 字符串而不是 IHtmlContent 对象,但这也失败了。
public static string GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
{
//if(string.IsNullOrEmpty(innerText))
// return HtmlString.Empty;
var tag = new TagBuilder("script");
tag.MergeAttribute("type", "application/ld+json");
tag.InnerHtml.AppendHtml(innerText);
tag.TagRenderMode = TagRenderMode.Normal;
return tag.ToHtmlString();
}
public static string ToHtmlString(this IHtmlContent content)
{
using var writer = new IO.StringWriter();
content.WriteTo(writer, HtmlEncoder.Default);
return writer.ToString();
}
您有没有破解方法来处理这个问题的想法?
最佳蒂诺
正在查看 the source code, there doesn't seem to be any way to disable the encoding for an attribute value. It might be worth logging an issue 是否可以添加;但就短期而言,您需要使用 TagBuilder
class.
以外的其他内容
private sealed class JsonLdScriptTag : IHtmlContent
{
private readonly string _innerText;
public JsonLdScriptTag(string innerText)
{
_innerText = innerText;
}
public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
writer.Write(@"<script type=""application/ld+json"">");
writer.Write(_innerText);
writer.Write("</script>");
}
}
public static IHtmlContent GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
=> new JsonLdScriptTag(innerText);
我写了一个 HtmlHelper 扩展来渲染 Json+Ld 脚本标签。 我向你求助的原因是,类型属性值“application/ld+json”被编码,看起来像“application/ld+json”,我可以找到一个解决方案。
我的 HtmlHelper 的 C# 代码:
public static IHtmlContent GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
{
//if(string.IsNullOrEmpty(innerText))
// return HtmlString.Empty;
var tag = new TagBuilder("script");
tag.MergeAttribute("type", "application/ld+json");
tag.InnerHtml.AppendHtml(innerText);
tag.TagRenderMode = TagRenderMode.Normal;
return tag;
}
在我看来,我使用 Html 分机,所以:
@Html.GetJsonLdScriptTag("")
Html 输出为:
<script type="application/ld+json"></script>
我尝试使用 HtmlDecode(...) 和 returning Html.Raw 进行解码(...);, 但没有成功。
另一个尝试是 return 字符串而不是 IHtmlContent 对象,但这也失败了。
public static string GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
{
//if(string.IsNullOrEmpty(innerText))
// return HtmlString.Empty;
var tag = new TagBuilder("script");
tag.MergeAttribute("type", "application/ld+json");
tag.InnerHtml.AppendHtml(innerText);
tag.TagRenderMode = TagRenderMode.Normal;
return tag.ToHtmlString();
}
public static string ToHtmlString(this IHtmlContent content)
{
using var writer = new IO.StringWriter();
content.WriteTo(writer, HtmlEncoder.Default);
return writer.ToString();
}
您有没有破解方法来处理这个问题的想法?
最佳蒂诺
正在查看 the source code, there doesn't seem to be any way to disable the encoding for an attribute value. It might be worth logging an issue 是否可以添加;但就短期而言,您需要使用 TagBuilder
class.
private sealed class JsonLdScriptTag : IHtmlContent
{
private readonly string _innerText;
public JsonLdScriptTag(string innerText)
{
_innerText = innerText;
}
public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
writer.Write(@"<script type=""application/ld+json"">");
writer.Write(_innerText);
writer.Write("</script>");
}
}
public static IHtmlContent GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
=> new JsonLdScriptTag(innerText);