web-dev-qa-db-ja.com

ASP.NET MVC Razorビューで改行文字を<br />に置き換えます

入力を受け付けるtextareaコントロールがあります。私は後で単に使用して、そのテキストをビューにレンダリングしようとしています:

@ Model.CommentText

これにより、すべての値が適切にエンコードされます。ただし、改行文字を<br />に置き換えたいため、新しいbrタグがエンコードされないようにする方法が見つかりません。 HtmlStringを使用しようとしましたが、まだ運がありません。

228
bkaid

XSS脆弱性にさらされる代わりに、 CSS white-space property を使用してください!

<span style="white-space: pre-line">@Model.CommentText</span>
617
Jacob Krall

以下を試してください:

@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))

更新:

この関連する質問marcind'sコメントによると、ASP.NET MVCチームは、Razorビューエンジンの<%:および<%=に類似したものを実装しようとしています。

アップデート2:

HTMLエンコーディングに関する質問は、有害なユーザー入力に関する議論に変えることができますが、それはすでに十分に存在しています。

とにかく、潜在的な有害なユーザー入力に注意してください。

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

更新3(Asp.Net MVC 3):

@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
110
Omar

HTMLヘルパーとしてのOmarの3番目のソリューションは次のとおりです。

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
9
thelem

改行(環境に依存しない)で分割し、定期的に印刷します。エンコードやxssについて心配する必要はありません。

@if (!string.IsNullOrWhiteSpace(text)) 
{
    var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var line in lines)
    {
        <p>@line</p>
    }
}

(空のエントリの削除はオプションです)

9
drzaus

いくつかのテキストを段落(「p」タグ)に分割する必要があったので、以前の回答のいくつかの推奨事項を使用して簡単なヘルパーを作成しました(皆さんありがとう)。

public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value) 
    { 
        value = html.Encode(value).Replace("\r", String.Empty);
        var arr = value.Split('\n').Where(a => a.Trim() != string.Empty);
        var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>";
        return MvcHtmlString.Create(htmlStr);
    }

使用法:

@Html.ToParagraphs(Model.Comments)
4
Andrea

DRY原理 をOmarのソリューションに適用すると、ここにHTMLヘルパー拡張機能があります。

using System.Web.Mvc;
using System.Text.RegularExpressions;

namespace System.Web.Mvc.Html {
    public static class MyHtmlHelpers {
        public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
            return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
        }
    }
}

使用法(改良された正規表現を使用):

@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")

これには、XSS脆弱性からのセキュリティを確保するために、Razor View開発者の負担を減らすという追加の利点もあります。


Jacobのソリューションに対する私の懸念は、CSSで改行をレンダリングすると HTMLセマンティクス が壊れることです。

4
Akaoni