একটি এমভিসিএইচটিএমএল স্ট্রিং কী এবং আমি কখন এটি ব্যবহার করব?


221

ডকুমেন্টেশন জন্যMvcHtmlString ভয়ানক আলোকিত নয়:

এমন একটি এইচটিএমএল-এনকোডযুক্ত স্ট্রিং প্রতিনিধিত্ব করে যা আবার এনকোড করা উচিত নয়।

এর ঠিক কী কী প্রভাব রয়েছে তা আমার কাছে পরিষ্কার নয়। দেখে মনে হচ্ছে কিছু এইচটিএমএল সাহায্যকারী পদ্ধতি আবার ফিরে আসেMvcHtmlString তবে কাস্টম সহায়কদের অনলাইন দেখেছি এমন বেশ কয়েকটি উদাহরণ কেবল একটি নিয়মিত স্ট্রিং ফিরিয়ে দেয়।

প্রশ্নাবলী:

কি একটি MvcHtmlString ?

আমি কখন এবং MvcHtmlStringতার stringবিপরীতে নির্বাচন করা উচিত ? কেন?

উত্তর:


246

এএসপি.এনইটি 4 একটি নতুন কোড নুগেট সিনট্যাক্স উপস্থাপন করেছে <%: %>। মূলত, <%: foo %>অনুবাদ করে <%= HttpUtility.HtmlEncode(foo) %>। টিএম এক্সএসএস প্রতিরোধের <%: %>জন্য <%= %>যেখানেই সম্ভব সম্ভাব্য পরিবর্তে বিকাশকারীদের ব্যবহার করার চেষ্টা করছে ।

যাইহোক, এটি এই সমস্যার সূচনা করে যে কোনও কোড ন্যুগেট ইতিমধ্যে এর ফলাফল এনকোড করে <%: %>দিলে সিনট্যাক্স এটিকে পুনরায় এনকোড করবে। এটি IHtml স্ট্রিং ইন্টারফেস (। নেট 4 এ নতুন) প্রবর্তনের মাধ্যমে সমাধান করা হয়েছে। যদি foo বিন্যাস () মধ্যে <%: foo() %>রিটার্ন একটি IHtmlString, <%: %>সিনট্যাক্স-সঙ্কেতাক্ষরে লিখা পুনরায় করা হবে না এটা।

এমভিসি 2 এর সাহায্যকারীরা এমভিসিএইচটিএমএল স্ট্রিং ফিরিয়ে দেয়, যা এএসপি.নেট 4 এ ইন্টারফেস আইএইচটিএমএল স্ট্রিং প্রয়োগ করে। সুতরাং বিকাশকারীরা যখন ব্যবহার করবেন<%: Html.*() %> এএসপি.নেট 4 এ করেন, ফলাফলটি ডাবল এনকোড হবে না।

সম্পাদনা:

এই নতুন সিনট্যাক্সের তাত্ক্ষণিক সুবিধা হ'ল আপনার মতামতগুলি আরও পরিষ্কার er উদাহরণস্বরূপ, আপনি <%: ViewData["anything"] %>পরিবর্তে লিখতে পারেন <%= Html.Encode(ViewData["anything"]) %>


আমি যোগ করতে চাই যে MVC 2 নেট 3.5 বিরুদ্ধে কম্পাইল করা হয় না 4. এর অর্থ এই যে MvcHtmlStringবাস্তবায়ন নেই IHtmlStringকারণ যে শুধুমাত্র 4. বিদ্যমান <%:সিনট্যাক্স আবশ্যক হাঁস-টাইপ - এটা সর্বদা ডাকব .ToHtmlString()আগে .ToString()ইন্টারফেসের হোক না কেন।
কিথ

2
আমি সংশোধন করে দাঁড়িয়ে আছি - আসলে MvcHtmlString.Createপদ্ধতিটি IHtmlStringপাওয়া যায় কিনা তা সনাক্ত করে এবং এটি সমর্থন করতে ফেরত শ্রেণিকে গতিশীলভাবে তৈরি করে যদি তা হয়: উইন্ডোজিটপ্রো.কম
কিথ

ফলোআপ: এমভিসিএইচটিএমএল স্ট্রিং এবং এইচটিএমএল স্ট্রিংয়ের মধ্যে কি অর্থপূর্ণ পার্থক্য রয়েছে? উপরে লিঙ্কযুক্ত ডক্সগুলি পড়ার পরেও, আমি এখনও জানতে পারি না যে এমভিসিএইচটিএমএল স্ট্রিং আমাকে এইচটিএমএলস্ট্রিং যা দেয় না।
ফ্লিপডব্বট

@ ফ্লিপডব্যাট - অর্থবোধের কোনও পার্থক্য নেই।
লেবি

2
উভয়ের মধ্যে একটি খুব সামান্য পার্থক্য আছে। এমভিসিএইচটিএমএল স্ট্রিং স্ট্রিংটি ফিরিয়ে দেবে mpএইপিটি টুস্ট্রিং () বা টোএইচটিএমটিল স্ট্রিং () আপনি যদি এটি একটি নাল স্ট্রিং পাস করেন। যদিও এইচটিএমএল স্ট্রিং নালায় ফিরতে থাকবে।
রসিসিডেড

87

এই একটি দেরী উত্তর কিন্তু যদি এই প্রশ্নের পড়া কেউ ক্ষুর ব্যবহার করছে, আপনি কি মনে রাখা উচিত যে ক্ষুর এনকোড সবকিছু ডিফল্টরূপে, কিন্তু ব্যবহার করে MvcHtmlStringআপনার HTML সাহায্যকারী আপনি ক্ষুর বলতে পারেন যে এটা এনকোড করার দরকার নেই

আপনি যদি চাইছেন যে রেজারটি কোনও স্ট্রিং ব্যবহার এনকোড না করে

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

কাঁচা () এর ডিসকোপলিং আমাদের দেখায় যে এটি স্ট্রিংটি এইচটিএমএল স্ট্রিংয়ের মোড়কে আবদ্ধ করে

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

" এইচটিএমএল স্ট্রিং কেবল এএসপি.নেট 4 এ বিদ্যমান।

এমভিসিএইচটিএমএল স্ট্রিং এমভিসি 2 তে নেট নেট 3.5 এবং। নেট 4 সমর্থন করার জন্য একটি সামঞ্জস্যতা শিম যুক্ত করা হয়েছিল। এখন এমভিসি 3 শুধুমাত্র নেট নেট 4, উত্স সামঞ্জস্যতার জন্য এটি সম্ভবত এমভিসি 2-> 3 এর জন্য সম্ভবত এইচটিএমএল স্ট্রিংয়ের মোটামুটি তুচ্ছ সাবক্লাস। " উত্স


11

আপনি যদি নিজের HtmlHelperএক্সটেনশন করতে চান তবে এর একটি দুর্দান্ত ব্যবহারিক ব্যবহার use উদাহরণস্বরূপ, আমি <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যদি কোনও এমভিসি সাহায্যকারী পদ্ধতিতে কাঁচা এইচটিএমএল পাস করতে চান তবে আপনি একটি ব্যবহার করবেন এবং আপনি সহায়ক পদ্ধতিটি এইচটিএমএলকে এনকোড করতে চান না।


হুম ... আমি ভেবেছিলাম এইচটিএমএল সহায়ক সহায়ক পদ্ধতির পুরো পয়েন্টটি এইচটিএমএলকে এনকোড করা। এইচটিএমএল সাহায্যকারী পদ্ধতিতে আমি অন্যথায় কী করব?
ডিভাক্সার

এবং, পাশাপাশি, আমি চায় আসতে একটি MvcHtmlStringএকটি HTML সাহায্যকারী পদ্ধতি থেকে?
ডিভাক্সার

থেকে পাস বা ফিরে। যদি আপনার এইচটিএমএল সাহায্যকারী প্রাক-পালানো এইচটিএমএল তৈরি করে এবং আপনি অন্য কেউ এটির থেকে পুনরায় পলায়ন করতে চান না তবে আপনি সেটিকে ফিরিয়ে দিতে চাইবেন।
এসএলএক্স

1
ঠিক আছে, আমি মনে করি এটি আমাকে আরও খানিকটা কাছাকাছি পেয়েছে, তবে (স্মার্ট পাছা হিসাবে আসার ঝুঁকিতে) আমি কীভাবে সিদ্ধান্ত নেব যে আমি অন্য কেউ আবার পালিয়ে যেতে চাই কিনা? কাউকে পালিয়ে যাওয়া এইচটিএমএল নিয়ে গণ্ডগোল করার ক্ষমতা দেওয়া কি সাধারণত ভাল / খারাপ অনুশীলন? আমি এর আগে এমন নির্মাণ কখনও দেখিনি। "এটি একটি স্ট্রিংয়ের মতো, তবে দয়া করে এটি স্পর্শ করবেন না ... এমন কিছু নেই যা আপনাকে এটি স্পর্শ করতে বাধা দেয়, তবে আমরা আপনাকে পছন্দ করব না।" ঐটা কিসের সম্পর্কে?
ডেভুসার

1
মুল বক্তব্যটি হ'ল নিয়মিত স্ট্রিংয়ের বিপরীতে এই স্ট্রিংটি ইতিমধ্যে এনকোড করা হয়েছে। অতএব, এটি স্পর্শ করার প্রয়োজন নেই।
এসএলএক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.