質問

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

  

@ Model.CommentText

これは、適切に、任意の値を符号化されています。しかし、私は<br />で改行文字を置換したいと私は確信して新しいBRタグがエンコードされませんことを確認する方法を見つけることができません。私はHtmlStringを使用して試してみましたが、まだすべての運を持っていませんでした。

役に立ちましたか?

解決

代わりに、

使用 CSS空白財産する XSSの脆弱性に自分自身を開放する!

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

他のヒント

HTMLヘルパーとしてオマールの第三ソリューションは以下のようになります:

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

改行で分割(環境に依存しない)と定期的に印刷していない - 心配する必要をコードするか、XSSについてます:

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

(空のエントリを削除は任意です)
オマールのソリューションに DRY原則を適用すると、ここに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の脆弱性からセキュリティを確保するために、以下カミソリビューの開発者の責任置くという利点もあります。

<時間>

ヤコブのソリューションとの私の関心は、CSSの休憩 HTMLセマンティクスので改行をレンダリングすることです。

私は以前の回答の推奨事項の一部を使用して、簡単なヘルパーを作成したので、段落(「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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top