Viết / xuất chuỗi HTML không thoát


436

Tôi đã lưu HTML an toàn / vệ sinh trong bảng DB.

Làm cách nào tôi có thể viết nội dung HTML này trong chế độ xem Dao cạo?

Nó luôn thoát khỏi các ký tự như <và ký hiệu &amp;.


76
Để cứu mọi người về lịch sử thảo luận lâu dài bên dưới -@Html.Raw()
Chris S

Để cứu những người như tôi đang cố gắng thực hiện điều này với các loại ẩn danh trong chế độ xem được nhập động, nơi điều này sẽ không hoạt động - hãy xem câu trả lời này cho câu hỏi cụ thể hơn của tôi. Mặc dù sử dụng phương pháp này với quan điểm đánh máy mạnh vẫn tốt hơn nếu tình huống của bạn cho phép.
brichins

Câu trả lời:


653

Giả sử nội dung của bạn nằm trong một chuỗi có tên mystring...

Bạn có thể dùng:

@Html.Raw(mystring)

Ngoài ra, bạn có thể chuyển đổi chuỗi của mình thành HtmlStringhoặc bất kỳ loại nào khác thực hiện IHtmlStringtrong mô hình hoặc trực tiếp nội tuyến và sử dụng thường xuyên @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString

Cảm ơn câu trả lời này. Giúp tôi hoàn thành một nhiệm vụ nhỏ mà tôi đang học. :) Tuy nhiên, tôi đang sử dụng phiên bản mới nhất của MVC3 và cho đến nay không có Html.Raw :(

1
Xin chào. Tôi đang sử dụng MVC 3 và tôi đang sử dụng phương thức Raw đúng cách.
Gui

1
Cảm ơn bạn đã trả lời! Tôi vẫn đang học MVC 3 và điều này đã lảng tránh tôi.
Todd Richardson

3
@Lorenzo, +1 Tôi đang sử dụng MVC 3 mới nhất với razorcú pháp và Html.Rawchắc chắn có sẵn cho tôi.
Chris Snowden

1
Lorenzo, tôi đã cập nhật câu trả lời để loại bỏ việc đề cập đến MVC Beta như cách đây vài năm. Hãy hoàn nguyên / thay đổi.
Alexei Levenkov

75

Trong ASP.NET MVC 3 Bạn nên làm một cái gì đó như thế này:

// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
//  Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)

13
Tôi thích phương thức này vì HTML.Raw sẽ nổ tung nếu chuỗi được truyền là null.
37Stars

1
Cảm ơn, điều này rất sạch sẽ!
Hajjat

64

Bạn có thể dùng

@{ WriteLiteral("html string"); }

5
Điều này thật tuyệt vời đối với tôi, đã sử dụng Dao cạo trong ứng dụng Hangfire để gửi email ... Html.Raw()không hoạt động ở đó
shanabus

1 cho WriteLiteral
muhammed húng quế

11

Đôi khi nó có thể khó sử dụng html thô. Chủ yếu là do lỗ hổng XSS. Nếu đó là một mối quan tâm, nhưng bạn vẫn muốn sử dụng html thô, bạn có thể mã hóa các phần đáng sợ.

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

Kết quả trong

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)

4

Bạn có thể đặt chuỗi của mình vào viewdata trong bộ điều khiển như thế này:

 ViewData["string"] = DBstring;

Và sau đó gọi viewdata đó trong view như thế này:

@Html.Raw(ViewData["string"].ToString())


0

Ví dụ hoàn chỉnh để sử dụng các hàm mẫu trong RazorEngine (ví dụ để tạo email):

@model SomeModel
@{
    Func<PropertyChangeInfo, object> PropInfo =
        @<tr class="property">
            <td>
                @item.PropertyName                
            </td>
            <td class="value">
                <small class="old">@item.OldValue</small>
                <small class="new">@item.CurrentValue</small>                
            </td>
        </tr>;
}

<body>

@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }

</body>
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.