web-dev-qa-db-fra.com

ASP.NET MVC Html.Encode - Nouvelles lignes

Html.Encode semble simplement appeler HttpUtility.HtmlEncode pour remplacer quelques caractères spécifiques à HTML par leurs séquences d'échappement.

Cependant, cela ne prend pas en compte la manière dont les nouvelles lignes et les espaces multiples seront interprétés (espaces blancs de balisage). Je fournis donc une zone de texte permettant à l'utilisateur de saisir un bloc d'informations en texte brut, puis d'afficher ultérieurement ces données sur un autre écran (à l'aide de Html.Encode); les nouvelles lignes et l'espacement ne seront pas conservés.

Je pense qu'il y a 2 options, mais peut-être qu'il y a une meilleure 3ème personne peut suggérer.

Une option serait simplement d'écrire une méthode statique qui utilise HtmlEncode, puis remplace les nouvelles lignes dans la chaîne résultante par <br> et les groupes d'espaces multiples avec &nbsp;.

Une autre option serait de déconner avec l'attribut white-space: pre dans mes feuilles de style. Cependant, je ne suis pas sûr que cela produirait des effets secondaires lorsque les méthodes d'assistance HTML incluent de nouvelles lignes et des tabulations pour rendre la source de la page jolie.

Existe-t-il une troisième option, comme un indicateur global, un événement ou une méthode que je peux utiliser pour modifier la manière dont l'encodage HTML est effectué sans avoir à refaire les méthodes d'assistance HTML?

24
David

HtmlEncode est uniquement destiné à encoder des caractères à afficher en HTML. En particulier, il ne code pas les caractères d'espacement.

Je voudrais aller avec votre première option, et en faire une méthode d'extension pour HtmlHelper. Quelque chose comme:

public static string HtmlEncode(this HtmlHelper htmlHelper,
                                string text, 
                                bool preserveWhitespace)
{
    // ...
}

Vous pouvez utiliser String.Replace() pour coder les nouvelles lignes et les espaces (ou Regex.Replace si vous avez besoin d'une meilleure correspondance).

23
Brannon

Utiliser le style="white-space:pre-wrap;" a fonctionné pour moi. Per cet article .

8
Alex

Si vous utilisez Razor, vous pouvez faire:

@MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "<br />"))

à votre avis, ou dans votre contrôleur:

HttpServerUtility httpUtil = new HttpServerUtility();
MvcHtmlString encoded = httpUtil.HtmlEncode(strToEncode).Replace(Environment.NewLine, "<br />");

Je n'ai pas testé la méthode du contrôleur, mais cela devrait fonctionner de la même manière.

5
TheUO

Placez votre sortie dans des blocs <pre></pre> et/ou <code></code>. Par exemple:

<pre>@someValue</pre> / <code>@someValue</code>

Utilisez le css équivalent sur une div existante:

<div style="white-space:pre-wrap;">@someValue</div>

Cela dépend si vous voulez le balisage sémantique ou si vous voulez jouer avec css. Je pense que ce sont plus propices que l'insertion de tags <br/>.

3
Tim Abell
    /// <summary>
    /// Returns html string with new lines as br tags
    /// </summary>
    public static MvcHtmlString ConvertNewLinesToBr<TModel>(this HtmlHelper<TModel> html, string text)
    {
        return  new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "<br />"));
    }
0
RitchieD