web-dev-qa-db-de.com

Konvertieren Sie IHtmlContent/TagBuilder in eine Zeichenfolge in C #

Ich verwende ASP.NET 5. Ich muss IHtmlContent in String konvertieren

IIHtmlContent ist Teil des Namespaces ASP.NET 5Microsoft.AspNet.Html.Abstractions und ist eine Schnittstelle, die TagBuilder implementiert

Vereinfacht habe ich folgende Methode

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

Wenn ich darauf hinweise 

string output = GetContent().ToString();

Ich bekomme die folgende Ausgabe für GetContent ()

"Microsoft.AspNet.Mvc.Rendering.TagBuilder" 

und nicht 

<tag>blah</tag>

was ich will

Ich habe auch versucht, StringBuilder zu verwenden

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

es hängt jedoch auch denselben Namespace und nicht den Zeichenfolgenwert an

Ich habe versucht, es zu TagBuilder zu werfen

TagBuilder content = (TagBuilder)GetContent();

tagBuilder verfügt jedoch nicht über eine Methode, die in String konvertiert wird

Wie konvertiere ich IHtmlContent oder TagBuilder in einen String?

16
zoaz

Wenn Sie den Inhalt nur als Zeichenfolge ausgeben müssen, fügen Sie einfach diese Methode hinzu und übergeben Sie Ihr IHtmlContent-Objekt als Parameter, um die Zeichenfolgenausgabe abzurufen:

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

Vielleicht möchten Sie noch einmal überlegen, warum Sie diesen Ansatz wählen, da der TagBuilder so gut wie jede Art von benutzerdefiniertem HTML erlaubt, die Sie sich vorstellen können. Die manuelle Ausgabe des Textes ist wahrscheinlich nicht erforderlich.

20
Ketrex

Hinzufügen zu der Antwort oben:

Die neue Instanz von HtmlEncoder funktioniert nicht in ASP.NET Core RTM, da der Microsoft.Extensions.WebEncoders-Namespace entfernt wurde und die neue HtmlEncoder-Klasse in einen neuen Namespace System.Text.Encodings.Web verschoben wird. Diese Klasse wird jetzt jedoch abstrakt geschrieben und einer versiegelten Klasse, sodass Sie keine neue Instanz oder eine davon abgeleitete Klasse erstellen können.

Übergeben Sie HtmlEncoder.Default an die Methode und es wird funktionieren 

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

In ASP.NET Core wurden einige sorgfältige Optimierungen eingeführt. Wenn Sie eine HTML-Erweiterungsmethode erstellen, besteht die effizienteste Methode darin, Zeichenfolgen zu vermeiden:

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

Schließlich brauchen wir in der Rasierapparat-Ansicht nicht einmal mehr @Html.Raw(Html.GetContent()) (was früher in ASP.NET MVC 5 erforderlich war), reicht es aus, nur @Html.GetContent() aufzurufen, und Razor wird sich um alle entfliehenden Aufgaben kümmern.

9
vulcan raven

es gibt ein Beispiel: 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