2009-02-07 9 views
23

Html.Encode कुछ एचटीएमएल विशिष्ट पात्रों को उनके बचने के दृश्यों को बदलने के लिए बस HttpUtility.HtmlEncode पर कॉल करना प्रतीत होता है।एएसपी.नेट एमवीसी एचटीएमएल। एन्कोड - नई लाइनें

हालांकि यह इस बात पर कोई विचार नहीं करता है कि नई लाइनों और एकाधिक रिक्त स्थानों की व्याख्या कैसे की जाएगी (मार्कअप व्हाइटस्पेस)। इसलिए मैं उपयोगकर्ता के लिए एक सादा पाठ ब्लॉक दर्ज करने के लिए एक टेक्स्ट क्षेत्र प्रदान करता हूं, और उसके बाद उस डेटा को दूसरी स्क्रीन पर प्रदर्शित करता है (Html.Encode का उपयोग करके), नई लाइनें और रिक्ति संरक्षित नहीं की जाएगी।

मुझे लगता है कि 2 विकल्प हैं, लेकिन हो सकता है कि कोई बेहतर 3 कोई सुझाव दे सके।

एक विकल्प सिर्फ एक स्थिर विधि HtmlEncode का उपयोग करता है लिखने के लिए किया जाएगा, और फिर  

एक अन्य विकल्प के साथ <br> साथ जिसके परिणामस्वरूप स्ट्रिंग में नई लाइनों और कई रिक्त स्थान के समूह की जगह white-space: pre साथ के बारे में गड़बड़ करने के लिए किया जाएगा मेरी स्टाइल शीट्स में विशेषता - हालांकि मुझे यकीन नहीं है कि यह साइड इफेक्ट्स का उत्पादन करेगा जब एचटीएमएल हेल्पर विधियों में पेज स्रोत को सुंदर बनाने के लिए नई लाइनें और टैबबिंग शामिल है।

वहाँ एक तीसरा विकल्प है, एक वैश्विक झंडा, घटना या विधि ओवरराइड मैं कैसे एचटीएमएल एन्कोडिंग किया जाता है बदलने के लिए एचटीएमएल सहायक तरीकों फिर से बनाए बिना उपयोग कर सकते हैं की तरह?

उत्तर

23

HtmlEncode केवल HTML में प्रदर्शित करने के लिए अक्षरों को एन्कोड करने के लिए है। यह विशेष रूप से व्हाइटस्पेस वर्णों को एन्कोड नहीं करता है।

मैं आपके पहले विकल्प के साथ जाऊंगा, और इसे HTMLHelper के लिए एक एक्सटेंशन विधि बनाउंगा।

public static string HtmlEncode(this HtmlHelper htmlHelper, 
           string text, 
           bool preserveWhitespace) 
{ 
    // ... 
} 

आप String.Replace() इस्तेमाल कर सकते हैं नई-पंक्तियों और रिक्त स्थान (या Regex.Replace अगर आप बेहतर मिलान की जरूरत है) सांकेतिक शब्दों में बदलना करने के लिए: की तरह।

2

<pre></pre> और/या <code></code> ब्लॉक के अंदर अपने उत्पादन रखो। उदा:

<pre>@someValue</pre>/<code>@someValue</code> 

उपयोग एक मौजूदा div पर बराबर सीएसएस:

<div style="white-space:pre-wrap;">@someValue</div> 

निर्भर करता है कि क्या आप अर्थ मार्कअप चाहते हैं या कि क्या आप सीएसएस के साथ बेला करना चाहते हैं। मुझे लगता है कि ये <br/> टैग डालने से पहले दोनों तटस्थ हैं।

6

style="white-space:pre-wrap;" का उपयोग करने के लिए मेरे लिए काम किया। प्रति this article

5

आप रेजर का उपयोग करते हैं आप कर सकते हैं:

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

अपने विचार में, या अपने नियंत्रक में:

HttpServerUtility httpUtil = new HttpServerUtility(); 
MvcHtmlString encoded = httpUtil.HtmlEncode(strToEncode).Replace(Environment.NewLine, "<br />"); 

मैं नियंत्रक विधि का परीक्षण नहीं किया है, लेकिन यह एक ही तरह से काम करना चाहिए ।

+0

नियंत्रक भाग संकलित नहीं होगा। – 1kevgriff

+0

संकलित नहीं करता है।होना चाहिए: MvcHtmlString एन्कोडेड = MvcHtmlString (HttpContext.Current.Server.HtmlEncode (बॉडी)। जगह (पर्यावरण। न्यूलाइन, "
")); – AntonK

+0

"प्रकार 'System.Web.HttpServerUtility' में कोई रचनाकार परिभाषित नहीं है" HttpUtility.HtmlEncode का उपयोग करें – Benoit

0
/// <summary> 
    /// Returns html string with new lines as br tags 
    /// </summary> 
    public static MvcHtmlString ConvertNewLinesToBr<TModel>(this HtmlHelper<TModel> html, string text) 
    { 
     return new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "<br />")); 
    } 
संबंधित मुद्दे