ASP.NET Core 在渲染 Json+Ld 脚本时不应在 TagBuilder 中对属性值进行编码

问题描述 投票:0回答:2

我编写了一个 HtmlHelper 扩展来渲染 Json+Ld 脚本标签。 我向你寻求帮助的原因是,type属性值“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&#x2B;json"></script>

我尝试使用 HtmlDecode(...) 并返回 Html.Raw(...); 进行解码,但没有成功。

另一个尝试是返回字符串而不是 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();
    }

您有办法在不使用黑客的情况下解决这个问题吗?

最好的蒂诺

c# asp.net asp.net-core asp.net-core-mvc json-ld
2个回答
0
投票

查看源代码,似乎没有任何方法可以禁用属性值的编码。可能值得记录一个问题,看看是否可以添加它;但短期内,您需要使用

TagBuilder
类以外的其他东西。

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);

0
投票

我有一个类似的问题 - 它有点 hacky,但我的 Razor 视图中的这一行简单代码对我有用:

@Html.Raw(HttpUtility.HtmlDecode(ViewHelper.CreateDefaultInlineStyle(ws)))

我将标签生成器作为 HtmlString 返回,例如

return tb.ToHtmlString();

是 Html.Raw 对它进行了排序,只是解码仍然将 + 返回为 +

© www.soinside.com 2019 - 2024. All rights reserved.