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?
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:
Kể từ ASP.NET MVC 3, bạn có thể sử dụng:
@Html.Raw(myString)
"myAttr='hello';myInt=10"
@(new HtmlString(myString))
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>
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.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))
cho ASP.NET Core
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",..)
Bạn cũng có thể sử dụng phương thức WriteLiteral
"'<>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