MvcHtmlString क्या है और मुझे इसका उपयोग कब करना चाहिए?


221

प्रलेखन के लिए MvcHtmlStringबहुत ज्ञानवर्धक नहीं है:

HTML-एन्कोडेड स्ट्रिंग का प्रतिनिधित्व करता है जिसे फिर से एन्कोड नहीं किया जाना चाहिए।

यह मेरे लिए स्पष्ट नहीं है कि इसके निहितार्थ क्या हैं। ऐसा लगता है कि कुछ HTML सहायक तरीके वापस आ गए हैं MvcHtmlString, लेकिन कई उदाहरण मैंने कस्टम हेल्पर्स के ऑनलाइन देखे हैं बस एक नियमित स्ट्रिंग लौटाते हैं।

प्रशन:

एक क्या है MvcHtmlString?

जब मैं का चयन करना चाहिए MvcHtmlStringसे अधिक stringविपरीत और इसके? क्यों?

जवाबों:


246

ASP.NET 4 एक नया कोड डला वाक्यविन्यास प्रस्तुत करता है <%: %>। अनिवार्य रूप से, <%: foo %>अनुवाद करता है <%= HttpUtility.HtmlEncode(foo) %>। टीम की कोशिश है कि XSS को रोकने के लिए जहाँ भी संभव हो, <%: %>इसके बजाय डेवलपर्स का उपयोग किया जाए <%= %>

हालाँकि, यह समस्या का परिचय देता है कि यदि कोई कोड नगेट पहले से ही अपना परिणाम एनकोड करता है, तो <%: %>सिंटैक्स इसे फिर से एनकोड करेगा। यह IHtmlString इंटरफ़ेस (.NET 4 में नया) की शुरूआत द्वारा हल किया गया है। यदि फू ()<%: foo() %> एक IHtmlString रिटर्न में है, तो <%: %>सिंटैक्स इसे फिर से एनकोड नहीं करेगा।

MVC 2 के सहायक MvcHtmlString को लौटाते हैं, जो ASP.NET 4 पर इंटरफ़ेस IHtmlString को लागू करता है। इसलिए जब डेवलपर्स <%: Html.*() %>ASP.NET 4 में उपयोग करते हैं , तो परिणाम डबल-एन्कोडेड नहीं होगा।

संपादित करें:

इस नए वाक्यविन्यास का एक तात्कालिक लाभ यह है कि आपके विचार थोड़े क्लीनर हैं। उदाहरण के लिए, आप <%: ViewData["anything"] %>इसके बजाय लिख सकते हैं <%= Html.Encode(ViewData["anything"]) %>


मैं जोड़ना होगा कि MVC 2 नेट 3.5, के खिलाफ संकलित किया गया है नहीं 4. इसका मतलब है कि MvcHtmlStringलागू नहीं है IHtmlStringक्योंकि यह है कि केवल 4 में मौजूद <%:वाक्य रचना चाहिए बतख प्रकार - यह हमेशा फोन करेगा .ToHtmlString()से पहले .ToString()इंटरफेस की परवाह किए बिना।
कीथ

2
मैं सही खड़ा हूं - वास्तव में यह MvcHtmlString.Createविधि पता लगाती है कि क्या IHtmlStringउपलब्ध है और गतिशील रूप से अगर यह है तो समर्थन करने के लिए लौटा हुआ वर्ग बनाता है: windowsitpro.com/article/net-framework/Encoding-and-Strings/…
कीथ

ऊपर का पालन करें: MvcHtmlString और HtmlString के बीच एक सार्थक अंतर है? ऊपर दिए गए डॉक्स को पढ़ने के बाद, मुझे अभी तक नहीं पता था कि MvcHtmlString मुझे क्या देता है जो HtmlString नहीं करता है।
फ्लिपडाउट

@flipdoubt - कोई सार्थक अंतर नहीं है।
लेवी

2
दोनों के बीच एक बहुत मामूली अंतर है। MvcHtmlString String.Empty को ToString () या ToHtmlString () में लौटाएगा यदि आप इसे अशक्त स्ट्रिंग पास करते हैं। हालांकि HtmlString नल को लौटाना जारी रखेगा।
रॉसीडेड

87

यह एक देर से जवाब है, लेकिन अगर कोई भी इस प्रश्न को पढ़ रहा है तो रेजर का उपयोग कर रहा है, तो आपको जो याद रखना चाहिए वह यह है कि रेजर डिफ़ॉल्ट रूप से सब कुछ एनकोड करता है, लेकिन MvcHtmlStringअपने html सहायकों में आप रेजर को बता सकते हैं कि इसे एन्कोड करने की आवश्यकता नहीं है

यदि आप चाहते हैं कि रेजर एक स्ट्रिंग उपयोग को एनकोड न करे

@Html.Raw("<span>hi</span>")

Decompiling Raw (), हमें दिखाता है कि यह स्ट्रिंग को HtmlString में लपेट रहा है

public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}

" HtmlString केवल ASP.NET 4 में मौजूद है।

MvcHtmlString .NET 3.5 और .NET दोनों का समर्थन करने के लिए MVC 2 में एक संगतता शिम जोड़ा गया था। अब केवल MVC 3 .NET 4 है, यह स्रोत संगतता के लिए MVC>> 3 के लिए निश्चित रूप से HtmlString का काफी तुच्छ उपवर्ग है। स्रोत


11

इसका एक अच्छा व्यावहारिक उपयोग यह है कि यदि आप अपना स्वयं का HtmlHelperएक्सटेंशन बनाना चाहते हैं । उदाहरण के लिए, मुझे <link>टैग सिंटैक्स को याद रखने की कोशिश से नफरत है , इसलिए मैंने <link>टैग बनाने के लिए अपना स्वयं का एक्सटेंशन तरीका बनाया है :

<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim tag = New TagBuilder("link")
    tag.MergeAttribute("type", "text/css")
    tag.MergeAttribute("rel", "stylesheet")
    tag.MergeAttribute("href", src)
    tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
    Dim result = tag.ToString(TagRenderMode.Normal)
    Return MvcHtmlString.Create(result)
End Function

मैं Stringइस विधि से लौट सकता था, लेकिन अगर मैं निम्नलिखित होता तो टूट जाता:

<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>

साथ MvcHtmlString, या तो का उपयोग कर <%: ... %>या <%= ... %>दोनों काम करेगा सही ढंग से।


7

आप एक का प्रयोग करेंगे MvcHtmlStringअगर आप एक MVC सहायक विधि के लिए कच्चे एचटीएमएल पारित करने के लिए चाहते हैं और आप सहायक विधि एचटीएमएल एन्कोड करने के लिए नहीं करना चाहती।


हम्म ... मुझे लगा कि एचटीएमएल को एन्कोड करने के लिए एक HTML सहायक विधि का पूरा बिंदु था। मैं HTML हेल्पर विधि के साथ अन्यथा क्या करूंगा?
देवकर

और, उस के अलावा, जब मैं चाहेगा वापसी एक MvcHtmlStringएक HTML सहायक विधि से?
देवकर

पास या से लौटना। यदि आपका एचटीएमएल हेल्पर प्री-एस्कैप्ड जेनेरेट करता है तो आप उसे वापस करना चाहते हैं और आप नहीं चाहते कि कोई और इसे दोबारा से निकाले।
SLaks

1
ठीक है, मुझे लगता है कि यह मुझे थोड़ा करीब हो जाता है, लेकिन एक स्मार्ट गधे के रूप में आने के जोखिम पर) मैं कैसे तय करूं कि मैं किसी और को फिर से बचाना चाहता हूं? क्या यह आमतौर पर अच्छा / बुरा अभ्यास है कि किसी को बचने वाले HTML के साथ गड़बड़ करने की क्षमता है? मैंने पहले कभी इस तरह का निर्माण नहीं देखा। "यह एक स्ट्रिंग की तरह है, लेकिन कृपया इसे न छुएं ... ऐसा नहीं है कि आपको इसे छूने से रोकने के लिए कुछ भी नहीं है, लेकिन हम आपको पसंद नहीं करेंगे।" यह किस बारे में है?
devuxer

1
मुद्दा यह है कि एक नियमित स्ट्रिंग के विपरीत, यह स्ट्रिंग पहले से एन्कोडेड है। इसलिए, इसे छूने की कोई आवश्यकता नहीं है।
SLAKs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.