ASP.NET MVC Razor kết xuất mà không cần mã hóa


250

Dao cạo mã hóa chuỗi theo mặc định. Có bất kỳ cú pháp đặc biệt để kết xuất mà không cần mã hóa?

Câu trả lời:


374

Kể từ ASP.NET MVC 3, bạn có thể sử dụng:

@Html.Raw(myString)

8
Đây không phải là hoàn toàn chính xác. Có, bạn có thể chèn một chuỗi thô nhưng nếu bạn có "'<>etc...những chuỗi này sẽ được thoát. Cách chính xác là sử dụng MvcHtmlString sẽ cho phép các ký tự "bất hợp pháp". Chẳng hạn, nếu bạn đang mã hóa dữ liệu Json ... mà không mã hóa toàn bộ mô hình
Daniel B. Chapman

4
Daniel, Html.Raw () "trả về đánh dấu không được mã hóa HTML."
Lucas

1
Html.Raw () mã hóa các trích dẫn ..."myAttr='hello';myInt=10"
Serge

4
Nó KHÔNG mã hóa dấu ngoặc kép. Bên cạnh những tài liệu rõ ràng nêu nó rõ như ban ngày ( "Phương pháp này kết thúc tốt đẹp đánh dấu HTML sử dụng các lớp IHtmlString, mà làm cho unencoded HTML." ) Tôi cũng đã thử nghiệm này và dấu ngoặc kép không được mã hóa.
James Wilkins


31

Cũng như cách tiếp cận @ Html.Raw (chuỗi) đã được đề cập, nếu bạn xuất ra một MvcHtmlString, nó sẽ không được mã hóa. Điều này có thể hữu ích khi thêm các tiện ích mở rộng của riêng bạn vào HtmlHelper hoặc khi trả về một giá trị từ mô hình xem của bạn mà bạn biết có thể chứa html.

Ví dụ: nếu mô hình xem của bạn là:

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

Đối với Core 1.0+ (và MVC 5+), hãy sử dụng HtmlString

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

sau đó

<!-- 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

Sử dụng @Html.Raw()thận trọng vì bạn có thể gây ra nhiều rắc rối hơn với mã hóa và bảo mật. Tôi hiểu trường hợp sử dụng vì tôi phải tự làm việc này, nhưng cẩn thận ... Chỉ cần tránh cho phép tất cả văn bản thông qua. Ví dụ: chỉ bảo toàn / chuyển đổi các chuỗi ký tự cụ thể và luôn mã hóa phần còn lại:

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

Sau đó, bạn yên tâm rằng bạn đã không tạo ra lỗ hổng bảo mật tiềm năng và bất kỳ ký tự đặc biệt / ngoại lai nào được hiển thị chính xác trong tất cả các trình duyệt.


+1 Chính xác những gì tôi cần! Chuỗi vẫn cần được mã hóa nhưng dòng trả về cần phải là html. Cảm ơn!
Peter

@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))cho ASP.NET Core
kenjiuno

5

Trong trường hợp ActionLink, nó thường sử dụng HttpUtility.Encode trên văn bản liên kết. Trong trường hợp đó, bạn có thể sử dụng HttpUtility.HtmlDecode(myString) nó làm việc cho tôi khi sử dụng HtmlActionLink để giải mã chuỗi mà tôi muốn vượt qua. ví dụ:

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



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.