es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ASP.NET Core no debería codificar el valor del atributo en TagBuilder al renderizar el script Json+Ld.

Escribí una extensión HtmlHelper para renderizar etiquetas de script Json+Ld.
La razón por la que te pido ayuda es porque el valor del atributo type, “application/ld+json”, está codificado y se ve como “application/ld+json” y no he encontrado una solución.

Mi código C# del HtmlHelper:

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

En mi vista utilizo la extensión Html así:

@Html.GetJsonLdScriptTag("")

La salida Html es:

<script type="application/ld+json"></script>

He intentado decodificarlo utilizando “HtmlDecode(…)” y devolviendo “Html.Raw(…)”, pero sin éxito.

Otro intento fue devolver una cadena en lugar de un objeto IHtmlContent, pero esto también falló.

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

¿Tienes alguna idea para manejar este problema sin trucos?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es causado por la codificación del carácter ‘+’ en el valor del atributo tipo. Una solución a este problema es utilizar el método UrlDecode de la clase HttpUtility para decodificar el valor del atributo antes de establecerlo en el objeto TagBuilder. Tu código actualizado debería verse así:

    public static IHtmlContent GetJsonLdScriptTag(this IHtmlHelper helper, string innerText)
    {
        var tag = new TagBuilder("script");
        tag.MergeAttribute("type", HttpUtility.UrlDecode("application/ld%2Bjson"));
    
        tag.InnerHtml.AppendHtml(innerText);
        tag.TagRenderMode = TagRenderMode.Normal;
    
        return tag;
    }
    

    Al utilizar el método UrlDecode, el carácter ‘+’ se decodificará correctamente y el valor del atributo tipo se establecerá en “application/ld+json” en lugar de “application/ld+json”.

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.