web-dev-qa-db-fra.com

Comment rendre les balises encodées en HTML correct, plutôt qu'en texte?

Je reçois le texte suivant à partir d'une base de données: (fourni par le client, donc je ne peux pas faire grand chose avec)

investment professionals.<BR /><BR /> blah blah blah

qui est rendu comme:

investment professionals.<BR /><BR /> blah blah blah

Je ne veux pas imprimer les balises <BR /> À l'écran. Je veux qu'ils se comportent comme de véritables pauses.

Le code Html Helper suivant crée l'étendue dans laquelle il existe, l'ajoute à un div et renvoie la chaîne HTML:

StringBuilder sbElements = new StringBuilder();

TagBuilder span = new TagBuilder("span") {InnerHtml = subject.AboutText};
sbElements.Append(span.ToString());

TagBuilder div = new TagBuilder("div");
div.MergeAttribute("class", "about-text");
div.InnerHtml = sbElements.ToString();

return div.ToString();

Si je Html.Encode() la sortie de la méthode d'aide, les balises codées - /&gt;&lt; - sont écrites à l'écran. Comment puis-je prendre le texte source que j'ai et m'assurer que les balises sont rendues en HTML plutôt qu'en texte?

22
DaveDev

Essaye ça:

    String Input = "investment professionals.&lt;BR /&gt;&lt;BR /&gt; blah blah blah";

    String Output = Server.HtmlDecode(Input);
19
Steve Wellens

Si vous utilisez Razor, il encodera doublement votre chaîne comme @Chevex l'a décrit. Si vous utilisez le nouveau MVC3 <%: %> syntaxe, il le codera également doublement. Quel que soit votre moteur de vue, vous pouvez contourner l'encodage avec la route IHtmlString (par exemple, MvcHtmlString) décrite par @Chevex ou en contournant l'encodage par défaut à l'aide d'une syntaxe de modèle différente.

La dernière, qui n'implique aucun changement de code, nécessite simplement de modifier la syntaxe que vous utilisez pour effectuer le rendu dans une vue.

Pour Razor:

@Html.Raw(yourvariable)

Pour le système de gabarit de vue par défaut de MVC:

<%=yourvariable%>
32
patridge

Remplacez return div.ToString() par MvcHtmlString.Create(div.ToString()) et la méthode return type par MvcHtmlString au lieu d'un string. Cela empêchera le moteur de vue d'encoder automatiquement la sortie.

Renvoyer MvcHtmlString est la pratique standard pour le rendu de sortie HTML via des méthodes d'assistance.

Ce qui se passe, c'est que vous décodez la valeur de la base de données et que le moteur de vue la réencode lorsqu'elle est rendue. Le moteur de vue Razor code automatiquement le code HTML de sortie dans vos vues, sauf s'il s'agit d'un MvcHtmlString. Renvoyer MvcHtmlString arrêtera cela.

public static MvcHtmlString MyNonHtmlEncodedOutput(this HtmlHelper html)
{
        StringBuilder sbElements = new StringBuilder();

        TagBuilder span = new TagBuilder("span") {InnerHtml = Server.HtmlDecode(subject.AboutText)};
        sbElements.Append(span.ToString());

        TagBuilder div = new TagBuilder("div");
        div.MergeAttribute("class", "about-text");
        div.InnerHtml = sbElements.ToString();

        return MvcHtmlString.Create(div.ToString());
}
10
Chev

Vous pouvez essayer ceci:

 String Input = "&lt;p&gt;New Appartments is Avaliable at very Reasonable Price&lt;/p&gt;";
 String Output = Server.HtmlDecode(Input);
 string _output = System.Text.RegularExpressions.Regex.Replace(Output, "<.*?>", string.Empty);
6
Shahnila

Vous voulez réellement utiliser Html.Decode(string). Cela convertira les caractères encodés comme &lt; à <.

2
realistschuckle

Juste pour ajouter mes résultats à cette question car je me battais pour utiliser × de cette manière.

SetInnerText () encodera html tout le texte par défaut alors qu'InnerHtml n'encode rien car il attend du html brut.

Donc, si j'ai la bonne solution, vous devrez d'abord décoder votre chaîne de texte pour obtenir les balises non codées (c'est-à-dire <br/>), puis définissez-le dans la propriété InnerHtml et les balises seront rendues en html.

vous auriez donc quelque chose comme

element.InnerHtml = Server.HtmlDecode(yourText);
1
ScottGuymer