2009-02-07 9 views
23

Html.Encode scheint einfach HttpUtility.HtmlEncode anrufen, um ein paar HTML-spezifische Zeichen mit ihren Escape-Sequenzen zu ersetzen.ASP.NET MVC Html.Encode - Neue Zeilen

Allerdings berücksichtigt dies nicht, wie neue Zeilen und mehrere Leerzeichen interpretiert werden (Markup-Leerzeichen). So stelle ich einen Textbereich zur Verfügung, damit ein Benutzer einen Klartextblock von Information eingeben kann, und später diese Daten auf einem anderen Bildschirm anzeigen (unter Verwendung Html.Encode), die neuen Linien und der Abstand werden nicht konserviert.

Ich denke, es gibt 2 Möglichkeiten, aber vielleicht gibt es eine bessere 3. kann jemand vorschlagen.

Eine Möglichkeit wäre, nur eine statische Methode zu schreiben, den Htmlencode verwendet und ersetzt dann neue Zeilen in dem resultierenden String mit <br> und Gruppen aus mehreren Räumen mit &nbsp;

Einer weiteren Möglichkeit zu Chaos wäre etwa mit den white-space: pre Attribut in meinen Stylesheets - aber ich bin mir nicht sicher, ob dies zu Nebenwirkungen führen würde, wenn HTML-Hilfsmethoden neue Zeilen und Tabs enthalten, um die Seitenquelle schön zu machen.

Gibt es eine dritte Option, wie eine globale Flag, Ereignis oder Methode überschreiben kann ich ändern, wie HTML-Codierung erfolgt, ohne die HTML-Helper-Methoden wiederholen müssen?

Antwort

23

HtmlEncode soll nur Zeichen für die Anzeige in HTML codieren. Es codiert insbesondere keine Leerzeichen.

Ich würde mit Ihrer ersten Option gehen und es zu einer Erweiterungsmethode für HtmlHelper machen. Etwas wie:

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

Sie String.Replace() verwenden könnte die Zeilenumbrüche und Leerzeichen (oder Regex.Replace, wenn Sie eine bessere Anpassung benötigen) zu kodieren.

2

Setzen Sie Ihre Ausgabe in <pre></pre> und/oder <code></code> Blöcke. Z. B:

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

Verwenden Sie das Äquivalent CSS auf einem vorhandenen div:

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

davon ab, ob Sie die semantisches Markup wollen, oder ob Sie mit CSS Geige wollen. Ich denke, diese sind beide besser als <br/> Tags einfügen.

6

Die Verwendung der style="white-space:pre-wrap;" funktionierte für mich. Pro this article.

5

Wenn Sie Razor können Sie tun:

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

Ihrer Ansicht oder in Ihrem Controller:

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

ich nicht die Controller-Methode getestet, aber es sollte auf die gleiche Weise arbeiten .

+0

Der Controller-Teil wird nicht kompiliert. – 1kevgriff

+0

Kompiliert nicht.sollte sein: MvcHtmlString codiert = MvcHtmlString (HttpContext.Current.Server.HtmlEncode (Body) .Replace (Environment.NewLine, "
")); – AntonK

+0

"Der Typ 'System.Web.HttpServerUtility' hat keine Konstruktoren definiert" verwenden Sie HttpUtility.HtmlEncode – Benoit

0
/// <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 />")); 
    }