web-dev-qa-db-ja.com

ASP.NET MVC Html.Encode-新しい行

Html.Encodeは、いくつかのhtml固有の文字をエスケープシーケンスに置き換えるために、単にHttpUtility.HtmlEncodeを呼び出すようです。

ただし、これでは、改行と複数のスペースがどのように解釈されるかについては考慮されません(マークアップホワイトスペース)。そこで、ユーザーが情報のプレーンテキストブロックを入力し、後でそのデータを別の画面に表示するために(Html.Encodeを使用して)テキスト領域を提供します。新しい行と間隔は保持されません。

2つのオプションがあると思いますが、誰かが提案できるより優れた3番目のものがあるかもしれません。

1つのオプションは、HtmlEncodeを使用する静的メソッドを記述し、結果の文字列の新しい行を<br>で置き換え、複数のスペースのグループを&nbsp;で置き換えることです。

別のオプションは、スタイルシートのwhite-space: pre属性をいじる方法ですが、Htmlヘルパーメソッドに新しい行とタブを含めてページのソースをきれいにするときに副作用が発生するかどうかはわかりません。

グローバルフラグ、イベント、メソッドオーバーライドなど、HTMLヘルパーメソッドをやり直すことなくHTMLエンコーディングの方法を変更するために使用できる3番目のオプションはありますか?

24
David

HtmlEncodeは、HTMLで表示する文字をエンコードすることのみを目的としています。特に空白文字はエンコードしません。

私はあなたの最初のオプションで行き、それをHtmlHelperの拡張メソッドにします。何かのようなもの:

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

String.Replace()を使用して、改行とスペースをエンコードできます(より適切なマッチングが必要な場合は_Regex.Replace_)。

23
Brannon

style="white-space:pre-wrap;"を使用するとうまくいきました。 この記事 あたり。

8
Alex

Razorを使用すると、次のことができます。

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

あなたのビュー、またはあなたのコントローラーで:

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

コントローラーメソッドはテストしていませんが、同じように動作するはずです。

5
TheUO

出力を<pre></pre>および<code></code>ブロック内に配置します。例えば:

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

既存のdivで同等のcssを使用します。

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

セマンティックマークアップが必要か、CSSをいじりたいかによって異なります。これらはどちらも<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