2010-02-19 17 views
205

MvcHtmlString के लिए documentation बहुत शिक्षाप्रद नहीं है:एक MvcHtmlString क्या है और मुझे इसका उपयोग कब करना चाहिए?

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

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

सवाल:

एक MvcHtmlString क्या है?

मुझे MvcHtmlStringstring से अधिक और इसके विपरीत कब चुनना चाहिए? क्यूं कर?

उत्तर

240

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

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

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

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

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

+0

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

+1

मैं सही खड़ा हूं - वास्तव में 'MvcHtmlString.Create' विधि यह पता लगाती है कि' IHtmlString' उपलब्ध है या नहीं, गतिशील रूप से लौटाई गई कक्षा को इसका समर्थन करने के लिए बनाता है: http://www.windowsitpro.com/article/net-framework/Encoding -और-स्ट्रिंग्स/3.aspx – Keith

+0

अभी भी दूसरे पढ़ने पर एक अच्छा जवाब :) – melaos

6

यदि आप कच्चे HTML को किसी एमवीसी सहायक विधि में पास करना चाहते हैं तो आप MvcHtmlString का उपयोग करेंगे और आप नहीं चाहते हैं कि सहायक उपकरण HTML को एन्कोड करें।

+0

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

+0

और, उस के अलावा, जब मैं * वापसी करना चाहते हैं * एक HTML सहायक विधि से एक 'MvcHtmlString'? – devuxer

+0

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

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 के साथ, या तो <%: ... %> या <%= ... %> होगा दोनों काम सही ढंग से इस्तेमाल करते हैं।

70

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

आप उस्तरा चाहते हैं सांकेतिक शब्दों में बदलना नहीं करने के लिए एक स्ट्रिंग का उपयोग

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

Decompiling कच्चे(), हमें पता चलता है कि यह एक HtmlString

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

"HtmlString केवल एएसपी में मौजूद है में स्ट्रिंग लपेटकर है .NET 4.

एमवीसीएचटीएमएलस्ट्रिंग एक संगतता शिम था जो .NET 3.5 दोनों का समर्थन करने के लिए एमवीसी 2 में जोड़ा गया था और .NET 4. अब जब एमवीसी 3 केवल .NET 4 है, तो यह संभवतः एमटीसी 2-> 3 के लिए स्रोत अनुकूलता के लिए एचटीएमएलस्ट्रिंग का एक मामूली सबक्लास है। " source

संबंधित मुद्दे

 संबंधित मुद्दे