ASP.NET MVCかみそりビューで
で改行文字を置き換え
-
26-09-2019 - |
質問
私は入力を受け付けTextAreaコントロールを持っています。私は後で簡単に使用してビューにそのテキストをレンダリングしようとしています:
@ Model.CommentText
これは、適切に、任意の値を符号化されています。しかし、私は<br />
で改行文字を置換したいと私は確信して新しいBRタグがエンコードされませんことを確認する方法を見つけることができません。私はHtmlStringを使用して試してみましたが、まだすべての運を持っていませんでした。
解決
使用 CSS空白財産する XSSの脆弱性に自分自身を開放する!
<span style="white-space: pre-line">@Model.CommentText</span>
他のヒント
次のことを試してみてください
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
アップデート:
この関連する質問にmarcind's
のコメントによると、 >、ASP.NET MVCチームはかみそりビューエンジンの<%:
と<%=
のようなものを実装するために探しています。
アップデート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 />"))
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)