Câu hỏi Phát ra các chuỗi chưa được mã hóa trong chế độ xem Dao cạo


Như ScottGu nói trong blog của anh ấy bài đăng «Theo nội dung mặc định được phát ra bằng cách sử dụng một khối @ được tự động mã hóa HTML để 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?

Vì mục đích đơn giản, hãy dính vào trường hợp đơn giản sau:

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

76
2017-07-28 19:41


gốc




Các câu trả lời:


Đây là cách tiếp cận yêu thích của tôi:

@Html.Raw("<p>my paragraph text</p>")

Nguồn là tham chiếu cú ​​pháp Razor của Phil Haack: http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx


107
2018-02-07 22:47





Bạn có thể tạo một thể hiện mới của MvcHtmlString mà sẽ không nhận được mã 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ử điều này:

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

17
2017-07-28 20:46



Thực ra bạn có thể sử dụng new HtmlString() trong MVC 3 cũng vì loại đó là .NET 4. - marcind
Thật! 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


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

Chúng tôi nhìn vào một số thay đổi cú pháp dao cạo khác, nhưng cuối cùng không ai trong số họ đã kết thúc thực sự là bất kỳ ngắn hơn HtmlString mới.

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

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

hoặc là

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

6
2017-07-29 01:15



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
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ự. - Andrew Stanton-Nurse


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ụ xem dao cạo 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.

Những gì tôi cuối cùng đã làm là để thực hiện một RawView đó là một song song của Xem bên trong các tập tin cshtml. Về cơ bản, để có được một chuỗi thô,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Điều này đòi hỏi một vài thay đổi đối với bố cục dự án, vì vậy tôi vừa viết một bài đăng blog về nó đây. 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 đã đi trước và triển khai toán tử chỉ mục trên RawView để cho phép

@RawView["Foo"]

Trong cơ hội không có ai đó cần phải lặp lại dữ liệu với một danh sách các phím.

Đọ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.


0
2017-08-18 22:21