MvcHtmlString คืออะไรและควรใช้เมื่อใด


221

เอกสารสำหรับการMvcHtmlStringไม่ได้ enlightening ชะมัด:

แสดงให้เห็นถึงสตริงเข้ารหัส HTML ที่ไม่ควรเข้ารหัสอีกครั้ง

ยังไม่ชัดเจนสำหรับฉันว่าความหมายของสิ่งนี้คืออะไร ดูเหมือนว่าวิธีการ HTML ตัวช่วยบางอย่างจะคืนค่าMvcHtmlStringแต่ตัวอย่างหลายอย่างที่ฉันเห็นออนไลน์ของผู้ช่วยที่กำหนดเองเพิ่งกลับสตริงปกติ

คำถาม:

อะไรคือ MvcHtmlString ?

เมื่อฉันควรเลือกMvcHtmlStringมากกว่าstringและในทางกลับกัน? ทำไม?

คำตอบ:


246

ASP.NET 4 <%: %>แนะนำไวยากรณ์รหัสนักเก็ตใหม่ โดยพื้นฐานแล้วแปลว่า<%: foo %> <%= HttpUtility.HtmlEncode(foo) %>ทีมกำลังพยายามให้ผู้พัฒนาใช้<%: %>แทนที่จะ<%= %>เป็นไปได้เพื่อป้องกัน XSS

อย่างไรก็ตามแนะนำนี้ปัญหาที่ว่าถ้านักเก็ตรหัสแล้ว encodes ผลระบุ<%: %>ไวยากรณ์จะเข้ารหัสใหม่มัน สิ่งนี้แก้ไขได้ด้วยการแนะนำอินเทอร์เฟซ IHtmlString (ใหม่ใน. NET 4) ถ้าfoo ()ใน<%: foo() %>คืนค่า IHtmlString<%: %>ไวยากรณ์จะไม่เข้ารหัสอีกครั้ง

ผู้ช่วยเหลือของ MVC 2 ส่งคืน MvcHtmlString ซึ่งใน ASP.NET 4 จะใช้อินเทอร์เฟซ IHtmlString ดังนั้นเมื่อนักพัฒนาใช้<%: Html.*() %>ใน ASP.NET 4 ผลลัพธ์จะไม่ถูกเข้ารหัสสองครั้ง

แก้ไข:

ประโยชน์ทันทีของไวยากรณ์ใหม่นี้คือมุมมองของคุณสะอาดขึ้นเล็กน้อย ตัวอย่างเช่นคุณสามารถเขียนแทน<%: ViewData["anything"] %><%= Html.Encode(ViewData["anything"]) %>


ฉันจะเพิ่ม MVC 2 ที่คอมไพล์ด้วย. Net 3.5 ไม่ใช่ 4 ซึ่งหมายความMvcHtmlStringว่าไม่ได้ใช้IHtmlStringเพราะมีเฉพาะใน 4 เท่านั้น<%:ไวยากรณ์ต้องเป็ดชนิด - มันจะเรียก.ToHtmlString()ก่อนเสมอ.ToString()โดยไม่คำนึงถึงอินเตอร์เฟส
Keith

2
ฉันยืนแก้ไข - จริงMvcHtmlString.Createตรวจหาวิธีไม่ว่าจะIHtmlStringเป็นที่มีอยู่และสร้างแบบไดนามิกชั้นกลับไปสนับสนุนมันถ้ามันเป็น: windowsitpro.com/article/net-framework/Encoding-and-Strings/...
คี ธ

การติดตามผล:มีความแตกต่างที่มีความหมายระหว่าง MvcHtmlString และ HtmlString หรือไม่ หลังจากอ่านเอกสารที่ลิงก์ด้านบนแล้วฉันก็ยังไม่รู้ว่า MvcHtmlString ให้อะไรฉันซึ่ง HtmlString ไม่ได้
flipdoubt

@flipdoubt - ไม่มีความแตกต่างที่มีความหมาย
Levi

2
มีความแตกต่างเล็กน้อยระหว่างสองสิ่งนี้ MvcHtmlString จะส่งคืน String.Empty ใน ToString () หรือ ToHtmlString () หากคุณส่งผ่านสตริง Null แม้ว่า HtmlString จะกลับมาเป็นโมฆะต่อไป
rossisdead

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 เป็น shim ที่เข้ากันได้ถูกเพิ่มเข้าไปใน MVC 2 เพื่อรองรับทั้ง. NET 3.5 และ. NET 4 ตอนนี้ MVC 3 เป็น. NET 4 เท่านั้นมันเป็นซับคลาสคลาสเล็กน้อยของ HtmlString น่าจะเป็น MVC 2-> 3 สำหรับความเข้ากันได้ของแหล่งที่มา " แหล่งที่มา


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ถ้าคุณต้องการส่ง HTML ดิบไปยังวิธีการ MVC helper และคุณไม่ต้องการให้วิธี helper เข้ารหัส HTML


อืม ... ฉันคิดว่าจุดทั้งหมดของวิธีการช่วยเหลือ HTML คือการเข้ารหัส HTML ฉันจะทำอะไรเป็นอย่างอื่นด้วยวิธีการของตัวช่วย HTML
devuxer

และนอกเหนือจากนั้นเมื่อจะฉันต้องการที่จะกลับMvcHtmlStringจากวิธีการช่วยเหลือ HTML ได้ไหม?
devuxer

ผ่านไปหรือกลับจาก คุณต้องการส่งคืนหากผู้ช่วย HTML ของคุณสร้าง HTML ที่มีการหลบหนีล่วงหน้าและคุณไม่ต้องการให้ผู้อื่นหลบหนีได้อีก
SLaks

1
โอเคฉันคิดว่ามันทำให้ฉันใกล้เข้ามานิดหน่อย แต่ (ด้วยความเสี่ยงที่จะเจอคนฉลาด) ฉันจะตัดสินใจได้อย่างไรว่าฉันต้องการคนอื่นหนีอีกหรือไม่ เป็นการดีหรือไม่ดีที่จะให้คนอื่นสามารถยุ่งกับการหลบหนี html หรือไม่? ฉันไม่เคยเห็นโครงสร้างแบบนี้มาก่อน "มันเป็นเหมือนสายอักขระ แต่โปรดอย่าแตะต้อง ... ไม่ใช่ว่ามีอะไรขัดขวางคุณจากการสัมผัส แต่เราไม่ต้องการให้คุณทำ" เกี่ยวกับอะไร
devuxer

1
ประเด็นก็คือไม่เหมือนกับสตริงปกติสตริงนี้ถูกเข้ารหัสแล้ว ดังนั้นจึงไม่จำเป็นต้องสัมผัส
SLAK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.