ASP.NET MVC রেজার ভিউতে <br /> দিয়ে লাইন ব্রেকের অক্ষরগুলি প্রতিস্থাপন করুন


241

আমার কাছে একটি টেক্সারিয়া নিয়ন্ত্রণ রয়েছে যা ইনপুট গ্রহণ করে। আমি পরে কেবল এইটি ব্যবহার করে সেই পাঠ্যটি দর্শনে উপস্থাপন করার চেষ্টা করছি:

@ Model.CommentText

এটি সঠিকভাবে কোনও মান এনকোডিং করছে is তবে আমি লাইন ব্রেকের অক্ষরগুলির সাথে প্রতিস্থাপন করতে চাই <br />এবং নতুন বিআর ট্যাগগুলি এনকোড না হয়ে গেছে তা নিশ্চিত করার কোনও উপায় আমি খুঁজে পাচ্ছি না। আমি এইচটিএমএল স্ট্রিং ব্যবহার করার চেষ্টা করেছি কিন্তু এখনও ভাগ্য হয়নি।


1
আমি অনুমান করি লাইনব্রেকগুলি \nডাটাবেসের মতো সংরক্ষণ করা হয় এবং আপনি একটিতে রূপান্তর করতে চান <br />?
মার্কো

হ্যাঁ - দর্শনটিতে কেবল / n সাথে <br /> প্রতিস্থাপন করার চেষ্টা করা হচ্ছে।
বিকেইড

উত্তর:


680

ব্যবহার করুন সিএসএস সাদা-স্পেস সম্পত্তি পরিবর্তে নিজেকে পদ্ধতি এটা XSS দুর্বলতা পর্যন্ত খোলার!

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

9
@ জ্যাকব ক্রোল - আমি আপনাকে একটি +1 দেওয়ার জন্য লগ ইন করেছি। কল্পনাপ্রসূত ছোট্ট কৌশল
লেভি বোটেলহো

6
quirksmode.org/css/ whitespace.html এর একটি ভাল ব্যাখ্যা আছে pre-line(আমি কেবল সচেতন ছিলাম nowrapএবং pre)।
জেমস স্কেম্প

7
এই সম্পর্কে জানতাম না। আমার চেয়ে অবশ্যই ভাল উত্তর।
ওমর

39
আসলে white-space: pre-wrap;আরও ভাল যেহেতু pre-lineআপনার স্পেসের সাথে সাদা জায়গাগুলিকে এক জায়গায় বিভক্ত করে বিশৃঙ্খলা করবে।
চিটিভি মালেক

4
দুর্ভাগ্যক্রমে এটি প্রায় কোনও ইমেল ক্লায়েন্টে (অফিস 2013 সহ) কাজ করবে না।
রজার ফার

115

নিম্নলিখিত চেষ্টা করুন:

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

হালনাগাদ:

মতে marcind'sমন্তব্য এই সংশ্লিষ্ট প্রশ্ন , ASP.NET MVC দলের অনুরূপ কিছু বাস্তবায়ন করতে খুঁজছেন হয় <%:এবং <%=রাজো দৃশ্য ইঞ্জিন।

আপডেট 2:

আমরা এইচটিএমএল এনকোডিং সম্পর্কিত যে কোনও প্রশ্নকে ক্ষতিকারক ব্যবহারকারীর ইনপুট সম্পর্কিত আলোচনায় পরিণত করতে পারি, তবে এর মধ্যে ইতিমধ্যে যথেষ্ট।

যাইহোক, সম্ভাব্য ক্ষতিকারক ব্যবহারকারী ইনপুটটির যত্ন নিন।

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

আপডেট 3 (এসপি নেট এমভিসি 3):

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

13
ওহে আমার ,শ্বর, না। আমি যদি কিছু সম্পর্কে মন্তব্য করার সিদ্ধান্ত নেন <script>
দারিন দিমিত্রভ

4
ধন্যবাদ - যে কাজ করেছে। খুব কাছাকাছি ছিল তবে অবশ্যই খুব শীঘ্রই বা খুব দেরিতে প্রতিস্থাপনটি করা হয়েছে। আমি এটি ব্যবহার করে শেষ করেছি: @ এমভিসিএইচটিএমএল স্ট্রিং.ক্রেইট (এইচটিএমএল.এনকোড (মডেল.কমেন্টটেক্সট) .পরিবর্তন ("\ n", "<br />")) কারণ পরিবেশ.নিউলাইন ঠিক কাজ করছিল না।
বিকেইড

2
এনভায়রনমেন্ট.নউলাইন পোস্টগুলি গঠনে আসলেই আবেদন করে না যেহেতু ব্রাউজারগুলি সাধারণত \nপরিবর্তে ফিরে আসে\r\n
বিল্ডস্টার্ট

20
এমভিসি 3-এর প্রকাশিত সংস্করণের জন্য, পরামর্শটি এমভিসিএইচটিএমএল স্ট্রিং ব্যবহার না করে @ এইচটিএমএল.রউ (এইচটিএমএল.এনকোড (মডেল.কমেন্টটেক্সট) হিসাবে উপস্থিত হয়েছে। পুনরায় প্রতিস্থাপন করুন (এনভায়রনমেন্ট.নউইলাইন, "<br />") ep কমপক্ষে প্রদর্শনের জন্য।
জেমস স্কেম্প

2
এনভায়রনমেন্ট.নউলাইন "\ r \ n" উপস্থাপন করে। যদি আমার ব্যবহারকারী লিনাক্স বা ম্যাক ব্যবহার করে ডেটা প্রবেশ করে তবে লাইনব্র্যাকগুলি কেবল "\ n" বা "\ r"। কোথাও এমন কোনও পদ্ধতি নেই যা এটিকে আমলে নেয়?
সানড্রোক

11

নিউলাইনগুলিতে বিভক্ত (পরিবেশগত অজ্ঞেয়) এবং নিয়মিত মুদ্রণ করুন - এনকোডিং বা এক্সএসএস নিয়ে চিন্তা করার দরকার নেই:

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

(খালি এন্ট্রি অপসারণ alচ্ছিক)


10

এইচটিএমএল সহায়ক হিসাবে ওমরের তৃতীয় সমাধানটি হ'ল:

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

5

ওমরের সমাধানে DRY নীতি প্রয়োগ করা , একটি এইচটিএমএল সহায়ক সাহায্যকারী এক্সটেনশান:

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 />")

এক্সএসএস দুর্বলতা থেকে সুরক্ষা নিশ্চিত করতে এটি রেজার ভিউ বিকাশকারীকে কম অনূদিত করার অতিরিক্ত সুবিধা রয়েছে।


জ্যাকব এর সমাধানের সাথে আমার উদ্বেগটি হ'ল সিএসএসের সাথে লাইন বিভাজক হওয়া HTML শব্দার্থকে বিরতি দেয় ।


4

আমার কিছু পাঠকে অনুচ্ছেদে ("পি" ট্যাগ) ভাঙ্গার দরকার ছিল, তাই আমি পূর্বের উত্তরের কয়েকটি সুপারিশ ব্যবহার করে একটি সাধারণ সহায়ক তৈরি করেছি (ধন্যবাদ আপনাকে বলছি)।

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)

0

আমি এই পদ্ধতিটি পছন্দ করি কারণ এটির জন্য ম্যানুয়ালি মার্কআপের প্রয়োজন হয় না। আমি এটি ব্যবহার করি কারণ আমি রেজার পৃষ্ঠাগুলি স্ট্রিংগুলিতে রেন্ডার করছি এবং তাদের ইমেলের মাধ্যমে প্রেরণ করছি, এটি এমন একটি পরিবেশ যেখানে সাদা-স্থান স্টাইলিং সর্বদা কাজ করে না।

public static IHtmlContent RenderNewlines<TModel>(this IHtmlHelper<TModel> html, string content)
{
    if (string.IsNullOrEmpty(content) || html is null)
    {
        return null;
    }

    TagBuilder brTag = new TagBuilder("br");
    IHtmlContent br = brTag.RenderSelfClosingTag();
    HtmlContentBuilder htmlContent = new HtmlContentBuilder();

    // JAS: On the off chance a browser is using LF instead of CRLF we strip out CR before splitting on LF.
    string lfContent = content.Replace("\r", string.Empty, StringComparison.InvariantCulture);
    string[] lines = lfContent.Split('\n', StringSplitOptions.None);
    foreach(string line in lines)
    {
        _ = htmlContent.Append(line);
        _ = htmlContent.AppendHtml(br);
    }

    return htmlContent;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.