ASP.NET MVC Razor จะเรนเดอร์โดยไม่มีการเข้ารหัส


250

มีดโกนเข้ารหัสสตริงตามค่าเริ่มต้น มีไวยากรณ์พิเศษสำหรับการแสดงผลโดยไม่ต้องเข้ารหัสหรือไม่

คำตอบ:


374

ตั้งแต่ ASP.NET MVC 3 คุณสามารถใช้:

@Html.Raw(myString)

8
สิ่งนี้ไม่ถูกต้องทั้งหมด ใช่คุณสามารถแทรกสตริงดิบ แต่ถ้าคุณมี"'<>etc...สิ่งเหล่านี้จะถูกหลบหนี วิธีที่ถูกต้องคือการใช้ MvcHtmlString ซึ่งจะทำให้ตัวอักษร "ผิดกฎหมาย" ตัวอย่างเช่นหากคุณกำลังเข้ารหัสข้อมูล Json ... โดยไม่ต้องเข้ารหัสทั้งรุ่น
Daniel B. Chapman

4
Daniel, Html.Raw () "ส่งคืนมาร์กอัพที่ไม่ได้เข้ารหัส HTML"
Lucas

1
Html.Raw () เข้ารหัสคำพูด ..."myAttr='hello';myInt=10"
Serge

4
มันไม่ได้เข้ารหัสคำพูด นอกจากเอกสารที่ชัดเจนระบุว่าเป็นวันธรรมดา ( "วิธีนี้ wraps HTML มาร์กอัปใช้คลาส IHtmlString ซึ่งทำให้unencoded HTML." ) ฉันยังผ่านการทดสอบนี้และคำพูดที่ไม่ได้เข้ารหัส
James Wilkins


31

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

ตัวอย่างเช่นหากโมเดลการดูของคุณคือ:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}

สำหรับ Core 1.0+ (และ MVC 5+) ให้ใช้ HtmlString

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}

แล้วก็

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>

10

ใช้@Html.Raw()ด้วยความระมัดระวังเนื่องจากอาจทำให้เกิดปัญหากับการเข้ารหัสและความปลอดภัย ฉันเข้าใจกรณีการใช้งานเพราะฉันต้องทำสิ่งนี้ด้วยตัวเอง แต่อย่างระมัดระวัง ... เพียงหลีกเลี่ยงการปล่อยให้ข้อความทั้งหมดผ่านไป ตัวอย่างเช่นสงวน / แปลงลำดับอักขระเฉพาะและเข้ารหัสส่วนที่เหลือ:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

จากนั้นคุณวางใจได้ว่าคุณยังไม่ได้สร้างช่องโหว่ความปลอดภัยและอักขระพิเศษ / ต่างประเทศจะแสดงอย่างถูกต้องในเบราว์เซอร์ทั้งหมด


+1 สิ่งที่ฉันต้องการ! สตริงยังคงต้องมีการเข้ารหัส แต่การส่งคืนบรรทัดจะต้องเป็น html ขอบคุณ!
ปีเตอร์

@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))สำหรับ ASP.NET Core
kenjiuno

5

ในกรณีของ ActionLink มักใช้ HttpUtility.Encode ในข้อความลิงค์ ในกรณีนี้คุณสามารถใช้งาน HttpUtility.HtmlDecode(myString) ได้กับฉันเมื่อใช้ HtmlActionLink เพื่อถอดรหัสสตริงที่ฉันต้องการส่ง เช่น:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)



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