web-dev-qa-db-fra.com

Convertir IHtmlContent/TagBuilder en chaîne en C #

J'utilise ASP.NET 5. J'ai besoin de convertir IHtmlContent en String

IIHtmlContent fait partie de l’espace de nom ASP.NET 5Microsoft.AspNet.Html.Abstractions et est une interface que TagBuilder implémente

Simplifié j'ai la méthode suivante

public static IHtmlContent GetContent()
{
    return new HtmlString("<tag>blah</tag>");
}

Quand je le référence 

string output = GetContent().ToString();

J'ai la sortie suivante pour GetContent ()

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

et pas 

<tag>blah</tag>

ce que je veux

J'ai aussi essayé d'utiliser StringBuilder

StringBuilder html = new StringBuilder();
html.Append(GetContent());

mais il ajoute également le même espace de nom et non la valeur de chaîne

J'ai essayé de le lancer sur TagBuilder

TagBuilder content = (TagBuilder)GetContent();

mais TagBuilder n'a pas de méthode qui convertit en chaîne

Comment convertir IHtmlContent ou TagBuilder en chaîne?

16
zoaz

Si tout ce que vous avez à faire est de générer le contenu sous forme de chaîne, ajoutez simplement cette méthode et transmettez votre objet IHtmlContent en tant que paramètre pour obtenir le résultat de la chaîne:

public static string GetString(IHtmlContent content)
{
    var writer = new System.IO.StringWriter();
    content.WriteTo(writer, HtmlEncoder.Default);
    return writer.ToString();
}

Vous voudrez peut-être reconsidérer la raison de cette approche, car TagBuilder autorise pratiquement tous les types de code HTML personnalisé auxquels vous pouvez penser. La sortie manuelle du texte n'est probablement pas nécessaire.

20
Ketrex

Ajoutant à la réponse ci-dessus:

La nouvelle instance de HtmlEncoder ne fonctionne pas dans ASP.NET Core RTM car l'espace de noms Microsoft.Extensions.WebEncoders a été supprimé et la nouvelle classe HtmlEncoder est déplacée vers un nouvel espace de noms System.Text.Encodings.Web, mais cette classe est maintenant écrite sous forme abstraite et scellée afin que vous ne puissiez pas créer une nouvelle instance ou une classe dérivée à partir de celle-ci.

Passez HtmlEncoder.Default à la méthode et cela fonctionnera 

public static string GetString(IHtmlContent content)
{
    var writer = new System.IO.StringWriter();
    content.WriteTo(writer, HtmlEncoder.Default);
    return writer.ToString();
}
23
devfric

ASP.NET Core a en fait introduit une poignée d’optimisations minutieuses. Si vous construisez une méthode d'extension HTML, le moyen le plus efficace consiste à éviter les chaînes:

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

Enfin, dans la vue rasoir, nous n’avons même plus besoin de @Html.Raw(Html.GetContent()) (ce qui était nécessaire auparavant dans ASP.NET MVC 5); il suffit d’appeler @Html.GetContent() pour que Razor s’occupe de toutes les affaires en fuite.

9
vulcan raven

voici un exemple: https://github.com/aspnet/Mvc/blob/release/2.2/test/Microsoft.AspNetCore.Mvc.Views.TestCommon/HtmlContentUtilities.cs

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