入力を受け付けるtextareaコントロールがあります。私は後で単に使用して、そのテキストをビューにレンダリングしようとしています:
@ Model.CommentText
これにより、すべての値が適切にエンコードされます。ただし、改行文字を<br />
に置き換えたいため、新しいbrタグがエンコードされないようにする方法が見つかりません。 HtmlStringを使用しようとしましたが、まだ運がありません。
XSS脆弱性にさらされる代わりに、 CSS white-space property を使用してください!
<span style="white-space: pre-line">@Model.CommentText</span>
以下を試してください:
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
この関連する質問 のmarcind's
コメントによると、ASP.NET MVCチームは、Razorビューエンジンの<%:
および<%=
に類似したものを実装しようとしています。
HTMLエンコーディングに関する質問は、有害なユーザー入力に関する議論に変えることができますが、それはすでに十分に存在しています。
とにかく、潜在的な有害なユーザー入力に注意してください。
@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))
@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
HTMLヘルパーとしてのOmarの3番目のソリューションは次のとおりです。
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>
}
}
(空のエントリの削除はオプションです)
いくつかのテキストを段落(「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)
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セマンティクス が壊れることです。