แสดงสตริงเป็น html ในมุมมอง mvc ของ asp.net


101

ฉันมีคอนโทรลเลอร์ที่สร้างสตริงที่มีมาร์กอัป html ตอนนี้เมื่อฉันแสดงบนมุมมองมันจะแสดงเป็นสตริงธรรมดาที่มีแท็กทั้งหมด ฉันพยายามใช้ตัวช่วย Html เพื่อเข้ารหัส / ถอดรหัสเพื่อแสดงอย่างถูกต้อง แต่ใช้งานไม่ได้

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

ในมุมมองของฉัน

@Html.Encode(str)

6
ฉันเดาว่าน่าHtml.Rawจะช่วยได้
Saeed Neamati

1
ฉันคิดว่าคุณสามารถใช้HtmlStrinคลาสได้เช่นเดียวกับในHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

คำตอบ:


175

คุณอยู่ใกล้คุณต้องการใช้ @Html.Raw(str)

@Html.Encodeรับสตริงและตรวจสอบให้แน่ใจว่าอักขระพิเศษทั้งหมดได้รับการจัดการอย่างเหมาะสม ซึ่งรวมถึงอักขระเช่นช่องว่าง


8
@ html.Raw คือสิ่งที่ฉันกำลังค้นหาขอบคุณสำหรับคำตอบ :)
เมื่อ

IHtmlString ที่กล่าวโดย @Jerad Rose ดีกว่ามาก
Pratyush Dhanuka

39

คุณควรใช้IHtmlStringแทน:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

เมื่อใดก็ตามที่คุณมีคุณสมบัติของโมเดลหรือตัวแปรที่ต้องใช้ HTML ฉันรู้สึกว่านี่เป็นแนวทางปฏิบัติที่ดีกว่า ก่อนอื่นทำความสะอาดสักหน่อย ตัวอย่างเช่น:

@Html.Raw(str)

เปรียบเทียบกับ:

@str

นอกจากนี้ฉันยังคิดว่ามันปลอดภัยกว่าเล็กน้อยเมื่อเทียบกับการใช้@Html.Raw()งานเนื่องจากกังวลว่าข้อมูลของคุณจะเป็น HTML หรือไม่ในคอนโทรลเลอร์ของคุณ ในสภาพแวดล้อมที่คุณมีนักพัฒนาส่วนหน้าและส่วนหลังนักพัฒนาส่วนหลังของคุณอาจปรับแต่งกับข้อมูลที่สามารถเก็บค่า HTML ได้มากขึ้นดังนั้นจึงควรเก็บข้อกังวลนี้ไว้ในส่วนหลัง (ตัวควบคุม)

โดยทั่วไปฉันพยายามหลีกเลี่ยงการใช้Html.Raw()ทุกครั้งที่ทำได้

อีกสิ่งหนึ่งที่น่าสังเกตคือฉันไม่แน่ใจว่าคุณมอบหมายงานที่ไหนstrแต่มีบางสิ่งที่เกี่ยวข้องกับฉันว่าคุณจะนำสิ่งนี้ไปใช้อย่างไร

ขั้นแรกควรทำในคอนโทรลเลอร์โดยไม่คำนึงถึงโซลูชันของคุณ ( IHtmlStringหรือHtml.Raw) คุณควรหลีกเลี่ยงตรรกะแบบนี้ในมุมมองของคุณเพราะมันไม่ได้อยู่ที่นั่นจริงๆ

นอกจากนี้คุณควรใช้ViewModelเพื่อรับค่าในมุมมองของคุณ (และอีกครั้งโดยใช้IHtmlStringเป็นประเภทคุณสมบัติ) การเห็นบางสิ่งบางอย่าง@Html.Encode(str)เป็นเรื่องที่น่ากังวลเล็กน้อยเว้นแต่คุณจะทำสิ่งนี้เพียงเพื่อทำให้ตัวอย่างของคุณง่ายขึ้น


1
ฉันต้องการชี้ให้เห็นว่าคอนโทรลเลอร์มีไว้สำหรับการกำหนดเส้นทางไม่ใช่ที่จัดเก็บข้อมูล นอกจากนี้นักพัฒนาส่วนหลังของคุณควรรู้ดีกว่าที่จะเปลี่ยนสัญญาที่มีอยู่ของรหัส UI ควรถูกผูกไว้กับโมเดลและหากโมเดลมีการเปลี่ยนแปลงอย่างมากการทดสอบหน่วยของคุณก็ควรหยุดชะงัก
Anthony Mason

ขอบคุณสำหรับคำตอบ. ฉันชอบมัน.
Thomas.Benz

ใช่คำตอบนี้ดีกว่ามากตอนแรกฉันใช้ Html.Raw แต่เมื่อฉันอ่านคำตอบนี้ฉันก็เปลี่ยนทันที
Pratyush Dhanuka

7

คุณสามารถใช้ได้ @Html.Raw(str)

ดูMSDNสำหรับข้อมูลเพิ่มเติม

ส่งกลับมาร์กอัปที่ไม่ได้เข้ารหัส HTML

วิธีนี้จะรวมมาร์กอัป HTML โดยใช้คลาส IHtmlString ซึ่งแสดงผล HTML ที่ไม่ได้เข้ารหัส


1

ฉันมีปัญหาคล้ายกันกับช่องป้อนข้อมูล HTML ใน MVC หน้าเว็บแสดงเฉพาะคีย์เวิร์ดแรกของฟิลด์ ตัวอย่าง: ช่องป้อนข้อมูล: "จิ้งจอกสีน้ำตาลด่วน" ค่าที่แสดง: "The"

ความละเอียดคือการใส่ตัวแปรในเครื่องหมายคำพูดในคำสั่งค่าดังนี้:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">

0

เมื่อเร็ว ๆ นี้ฉันมีปัญหาคล้ายๆ กันและ google ก็พาฉันมาที่นี่ดังนั้นฉันจึงใส่คำตอบนี้ไว้ที่นี่ในกรณีที่คนอื่นมาที่นี่ด้วยเพื่อความสมบูรณ์

ผมสังเกตเห็นว่าเมื่อฉันได้รูปแบบไม่ HTML , ฉันเป็นจริงมีทุกแท็กของฉันออกปล้นมีเพียงเนื้อหาแท็กที่ไม่เหลือ โดยเฉพาะอย่างยิ่งฉันมีตารางที่มีแท็กเปิดตารางที่ขาดหายไปจากนั้นแท็ก html ทั้งหมดของฉันจากสตริงทั้งหมดที่ฉีกออกทั้งหมด

ดังนั้นหากข้างต้นไม่ได้ผลและคุณยังคงเกาหัวอยู่ให้ตรวจสอบ html ของคุณด้วยว่าถูกต้องหรือไม่

ฉันสังเกตเห็นแม้หลังจากที่ฉันใช้งานได้ MVC ก็เพิ่มแท็ก tbody โดยที่ฉันไม่มีเลย สิ่งนี้บอกฉันว่ามีการล้างข้อมูลเกิดขึ้น (MVC 5) และเมื่อไม่สามารถเกิดขึ้นได้ก็จะตัดแท็กทั้งหมด / บางแท็กออก

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