Html.Encode
seems to simply call HttpUtility.HtmlEncode
to replace a few html specific characters with their escape sequences.
However this doesn't provide any consideration for how new lines and multiple spaces will be interpretted (markup whitespace). So I provide a text area for the a user to enter a plain text block of information, and then later display that data on another screen (using Html.Encode
), the new lines and spacing will not be preserved.
I think there are 2 options, but maybe there is a better 3rd someone can suggest.
One option would be to just write a static method that uses HtmlEncode, and then replaces new lines in the resulting string with <br>
and groups of multiple spaces with
Another option would be to mess about with the white-space: pre
attribute in my style sheets - however I'm not sure if this would produce side effects when Html helper methods include new lines and tabbing to make the page source pretty.
Is there a third option, like a global flag, event or method override I can use to change how html encoding is done without having to redo the html helper methods?
HtmlEncode
is only meant to encode characters for display in HTML. It specifically does not encode whitespace characters.I would go with your first option, and make it an extension method for HtmlHelper. Something like:
You could use
String.Replace()
to encode the newlines and spaces (orRegex.Replace
if you need better matching).Using the
style="white-space:pre-wrap;"
worked for me. Per this article.If you use Razor you can do:
in your view, or in your controller:
I have not tested the controller method, but it should work the same way.
Put your output inside
<pre></pre>
and/or<code></code>
blocks. E.g:Use the equivalent css on an existing
div
:Depends whether you want the semantic markup or whether you want to fiddle with css. I think these are both neater than inserting
<br/>
tags.