ASP.NET MVC रेजर दृश्य में <br /> के साथ लाइन ब्रेक वर्ण बदलें


241

मेरे पास एक टेक्स्टारिया नियंत्रण है जो इनपुट स्वीकार करता है। मैं बाद में केवल उपयोग करके उस पाठ को एक दृश्य में प्रस्तुत करने की कोशिश कर रहा हूं:

@ Model.CommentText

यह किसी भी मान को ठीक से एन्कोडिंग है। हालाँकि, मैं लाइन ब्रेक पात्रों को बदलना चाहता हूं <br />और मुझे यह सुनिश्चित करने का कोई तरीका नहीं मिल सकता है कि नए br टैग्स को एन्कोड नहीं किया जाए। मैं HtmlString का उपयोग करने की कोशिश की है, लेकिन अभी तक कोई भाग्य नहीं था।


1
मुझे लगता \nहै कि डेटाबेस में लाइनब्रीक्स संग्रहीत हैं और आप एक में बदलना चाहते हैं <br />?
मार्को

हां - केवल देखने में <br /> के साथ \ n बदलने का प्रयास कर रहा है।
22

जवाबों:


681

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:

हम हानिकारक उपयोगकर्ता इनपुट पर चर्चा में 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 />"))

13
ओह माई जीओडी, नहीं। क्या होगा अगर मैं कुछ के बारे में टिप्पणी करने का फैसला करता हूं <script>
डारिन दिमित्रोव

4
साभार - कि काम किया बहुत करीब था, लेकिन बहुत जल्द या बहुत देर से बदल रहा है। मैंने इसका उपयोग करते हुए समाप्त किया: @ MvcHtmlString.Create (Html.Encode (Model.CommentText) .Replace ("\ n", "<br />")) क्योंकि Environment.Newinine सही काम नहीं कर रहा था।
बाकिड


20
MVC 3 के रिलीज़ किए गए संस्करण के लिए, सुझाव MvcHtmlString का उपयोग करने के बजाय, @ Html.Raw (Html.Encode (Model.CommentText) .Replace (Environment.NewLine, "<br />") प्रतीत होता है। कम से कम प्रदर्शन के लिए।
जेम्स स्कैप

2
एनवायरनमेंट.न्यूलाइन "\ r \ n" का प्रतिनिधित्व करता है। यदि मेरा उपयोगकर्ता लिनक्स या मैक का उपयोग करके डेटा दर्ज करता है, तो लाइनब्रेक सिर्फ "\ n" या "\ r" हैं। कहीं ऐसा तरीका तो नहीं है जो इसे ध्यान में रखता है?
सैंडरॉक

11

नए अंक (पर्यावरण अज्ञेय) पर विभाजित करें और नियमित रूप से प्रिंट करें - एन्कोडिंग या xss के बारे में चिंता करने की आवश्यकता नहीं है:

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

(रिक्त प्रविष्टियों को हटाना वैकल्पिक है)


10

HTML हेल्पर के रूप में उमर का तीसरा समाधान होगा:

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

5

उमर के समाधान के लिए 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 भेद्यताओं से सुरक्षा सुनिश्चित करने के लिए रेजर व्यू डेवलपर पर कम ओनस लगाने का अतिरिक्त लाभ भी है।


जैकब के समाधान के साथ मेरी चिंता यह है कि सीएसएस के साथ लाइन ब्रेक का प्रतिपादन 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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.