Phát các chuỗi chưa được mã hóa trong chế độ xem Razor


81

Như ScottGu nói trong bài đăng trên blog của anh ấy «theo mặc định, nội dung được phát ra bằng khối @ được mã hóa HTML tự động để bảo vệ tốt hơn trước các tình huống tấn công XSS». Câu hỏi của tôi là: làm thế nào bạn có thể xuất một chuỗi không được mã hóa HTML?

Vì lợi ích của sự đơn giản, vui lòng dính vào trường hợp đơn giản này:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}

Câu trả lời:



17

Bạn có thể tạo một phiên bản mới của MvcHtmlString sẽ không được mã hóa HTML.

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Hy vọng rằng sẽ có một cách dễ dàng hơn trong tương lai của Razor.

Nếu bạn không sử dụng MVC, bạn có thể thử cách này:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}

2
Trên thực tế bạn Linh hồn có thể sử dụng new HtmlString()trong MVC 3 cũng kể từ khi loại đó là NET 4.
marcind

Thật! Tuy nhiên, khi gõ tất cả những điều đó trong một biểu thức, tôi thích MVC hơn. Ví dụ: @ MvcHtmlString.Create (myString). Sở thích cá nhân!
aolde

6

HtmlString mới chắc chắn là câu trả lời.

Chúng tôi đã xem xét một số thay đổi cú pháp dao cạo khác, nhưng cuối cùng không có thay đổi nào trong số chúng thực sự ngắn hơn HtmlString mới.

Tuy nhiên, chúng tôi có thể gói nó thành một người trợ giúp. Có khả năng...

@Html.Literal("<p>something</p>")

hoặc là

@"<p>something</p>".AsHtml()

1
Có thể thêm @ = myString như một cách để xuất HTML không? Có lẽ quá nhiều hồi tưởng lại WebForms ...
aolde

2
Chúng tôi muốn tránh thêm các cấu trúc cú pháp mà chúng không bao gồm một trường hợp người dùng chính. Hầu hết thời gian, bạn sẽ sử dụng các phương thức trợ giúp để xây dựng chuỗi và IHtmlString hoạt động hoàn hảo ở đó. Đối với những trường hợp kỳ lạ khi bạn cần xuất ra một chuỗi ký tự mà không có trình trợ giúp, chúng tôi có thể cung cấp một phương thức cho bạn: @Literal (foo) hoặc tương tự.
Andrew Stanton-Nurse

0

Tôi cũng gặp phải vấn đề này khi chuyển dự án của chúng tôi sang công cụ chế độ xem Razor mới. Cách tiếp cận tôi đã thực hiện hơi khác vì chúng tôi phải tạo dữ liệu JSON từ C # và muốn xuất dữ liệu đó khi tải trang.

Những gì cuối cùng tôi đã làm là triển khai một RawView song song với Chế độ xem bên trong các tệp cshtml. Về cơ bản, để có được một chuỗi thô,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Điều này yêu cầu một vài thay đổi đối với bố cục dự án, vì vậy tôi chỉ viết một bài đăng trên blog về nó ở đây . Tóm lại, điều này yêu cầu triển khai trùng lặp DynamicViewDataDictionary của MVC và một Trang WebViewPage mới có chứa RawView. Tôi cũng đã tiếp tục và triển khai toán tử chỉ mục trên RawView để cho phép

@RawView["Foo"]

Trong trường hợp ngẫu nhiên, ai đó cần lặp lại dữ liệu với một danh sách các khóa.

Đọc bình luận của anurse, có lẽ sẽ tốt hơn nếu tôi đặt tên nó là Literal thay vì RawView.


0

Tôi đang sử dụng ASP.NET MVC và Razor trong Mono.

Tôi không thể tải HtmlHelper từ System.Web.WebPages của System.Web.Mvc vì một số lý do.

Nhưng tôi đã quản lý để xuất ra chuỗi không được mã hóa sau khi khai báo thuộc tính của mô hình là RazorEngine.Text.RawString . Bây giờ nó cho kết quả như mong đợi.

Thí dụ

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

Đầu ra:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
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.