J'utilise ASP.NET 5. J'ai besoin de convertir IHtmlContent en String
IIHtmlContent
fait partie de l’espace de nom ASP.NET 5
Microsoft.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?
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.
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();
}
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.
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();
}
}