سؤال

لدي عنصر تحكم 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>
    }
}

(إزالة الإدخالات الفارغة اختيارية)

تطبيق مبدأ جاف إلى حل عمر ، إليك امتداد HTML Helper:

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));
        }
    }
}

الاستخدام (مع regex المحسنة):

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

هذا له أيضًا فائدة إضافية تتمثل في وضع أقل على مسؤولية Razor View لضمان الأمن من نقاط الضعف 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