web-dev-qa-db-ja.com

asp.net mvcは\ n改行をHTMLブレークに変換します

Mvcにtextareaがあります。データが入力され、それをユーザーに表示しているときに、改行を表示するにはどうすればよいですか?

私はこのように表示します:

<%= Model.Description%>
28
Shawn Mclean

次のクラスは、テキストを適切にエンコードするHtmlHelperを実装します。

public static class HtmlExtensions
{
    public static MvcHtmlString Nl2Br(this HtmlHelper htmlHelper, string text)
    {
        if (string.IsNullOrEmpty(text))
            return MvcHtmlString.Create(text);
        else
        {
            StringBuilder builder = new StringBuilder();
            string[] lines = text.Split('\n');
            for (int i = 0; i < lines.Length; i++)
            {
                if (i > 0)
                    builder.Append("<br/>\n");
                builder.Append(HttpUtility.HtmlEncode(lines[i]));
            }
            return MvcHtmlString.Create(builder.ToString());
        }
    }
}

ビューで簡単に使用できます。

<%= Html.Nl2Br(Model.MultilineText) %>

または、Razorの場合:

@Html.Nl2Br(Model.MultilineText)
50
Codo

問題を解決するためのわずかに異なる(そして、私見、より良く、より安全な)方法については、 同様の質問に対するこの回答 を参照してください。

基本的に、すべての改行文字を<br>要素に変換する手間をかける代わりに、入力テキストを表示している要素に次のCSSを適用するのと同じくらい簡単です。

white-space: pre-line
19
mkataja

ユーザーが入力したテキストを常にエンコードするビューに表示するときは、安全であることを確認してください。

Cyber​​nateが提案したとおりに行うことも、HtmlHelper拡張メソッドに追加することもできます

public static string EncodedMultiLineText(this HtmlHelper helper, string text) {
  if (String.IsNullOrEmpty(text)) {
    return String.Empty;
  }
  return Regex.Replace(helper.Encode(text), Environment.NewLine, "<br/>")
}

ビューで簡単に再利用できるように

<%= Html.EncodedMultiLineText(Model.Description) %>
9
David Glenn

次のようなものを試してください:

<%=
Regex.Replace(
              Html.Encode(Model.Description), 
              Environment.NewLine, 
              "<br/>", 
              RegexOptions.IgnoreCase||RegexOptions.Multiline
             )
%>
6
Chandu

静的HTMLヘルパー拡張機能を提供する上記の回答は、廃止されたコンストラクターを提供します。

return new MvcHtmlString(builder.ToString());

この行は、次のコード行で置き換えることができます。

return MvcHtmlString.Create((builder.ToString()));
5
Roland Schaer

私はこれを answer はcssを使用するだけで素敵な方法で問題を解決すると思います:style="white-space: pre-line"チェック: CSSの空白プロパティ

3
Raúl Otaño

Asp.net mvc razorの場合、xss攻撃をブロックするためにHtml.Encodeを使用しました

@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
1

私はHtmlExtensions、Environment.NewLine、Regexを使用するのが好きです。これらは異なる回答に含まれていたので、上記の回答を1つのメソッドに入れました。

public static MvcHtmlString MultiLineText(this HtmlHelper htmlHelper, string text) {
 if (string.IsNullOrEmpty(text)) {
     return MvcHtmlString.Create(string.Empty);
 }
 return MvcHtmlString.Create(Regex.Replace(HttpUtility.HtmlEncode(text), Environment.NewLine, "<br/>"));
}

使用する

<%= Html.MultiLineText(Model.MultilineText) %>

または

@Html.MultiLineText(Model.MultilineText)
1
Alvis

多分それは答えです: HTMLエンコードされたMVCビューで改行をどのように処理しますか?

または

あなたが試すことができます:

Model.Description.Replace(Environment.NewLine, "<br/>");
0
alexl

これは私のために働く-

<%= HttpUtility.HtmlDecode(Html.ActionLink( "AOT <br /> Claim#"、 "actionName"))%>

0
Hemant Tank