2010-07-28 21 views
76

Như ScottGu đã nói trong blog của mình post «theo nội dung mặc định được phát ra bằng khối @ được mã hóa HTML tự động để bảo vệ tốt hơn chống lại các kịch bản 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 ra một chuỗi không được mã hóa HTML?Phát ra các chuỗi chưa được mã hóa trong chế độ xem Dao cạo

Vì lợi ích của sự đơn giản, pls 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... 
} 

Trả lời

17

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

@{ 
    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 Dao cạo.

Nếu bạn không sử dụng MVC, bạn có thể thử 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 'HtmlString mới()' trong MVC 3 cũng kể từ khi loại mà là .NET 4. – marcind

+0

Thật vậy! Tuy nhiên khi gõ tất cả những gì trong một biểu thức tôi thích một 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ố đó thực sự ngắn hơn HtmlString mới.

Tuy nhiên, chúng tôi có thể kết hợp nó thành người trợ giúp. Có thể ...

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

hoặc

@"<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 cho 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 các chuỗi và IHtmlString hoạt động hoàn hảo ở đó. Đối với các trường hợp lẻ khi bạn cần xuất chuỗi ký tự không có trình trợ giúp, chúng tôi có thể cung cấp phương thức cho bạn: @Literal (foo) hoặc tương tự. –

0

Tôi chạy vào vấn đề này cũng như khi chuyển dự án của chúng tôi để các công cụ xem Razor mới. Cách tiếp cận tôi đã thực hiện hơi khác một chút 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.

Điều cuối cùng tôi đã làm là triển khai 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 nguyên,

@(new HtmlString(View.Foo)) 

// became 
@RawView.Foo 

Điều này đòi hỏi một vài thay đổi để bố trí dự án, vì vậy tôi chỉ viết lên một bài đăng blog về nó here. Tóm lại, điều này đòi hỏi phải thực hiện trùng lặp DynamicViewDataDictionary của MVC và một 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 ai đó cần lặp lại dữ liệu bằng danh sách khóa.

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