Hiển thị chuỗi dưới dạng html trong chế độ xem mvc asp.net


98

Tôi có một bộ điều khiển tạo chuỗi chứa các đánh dấu html. Bây giờ khi tôi hiển thị nó trên các khung nhìn, nó được hiển thị dưới dạng chuỗi đơn giản chứa tất cả các thẻ. Tôi đã cố gắng sử dụng trình trợ giúp Html để mã hóa / giải mã để hiển thị đúng cách, nhưng nó không hoạt động.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

Theo quan điểm của tôi,

@Html.Encode(str)

6
Tôi đoán Html.Rawnên giúp đỡ.
Saeed Neamati

Ngoài ra tôi nghĩ rằng bạn có thể sử dụng HtmlStrinlớp, như trongHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Câu trả lời:


168

Bạn đang ở gần bạn muốn sử dụng @Html.Raw(str)

@Html.Encodelấy chuỗi và đảm bảo rằng tất cả các ký tự đặc biệt được xử lý đúng cách. Chúng bao gồm các ký tự như dấu cách.


6
@ Html.Raw là chính xác những gì tôi đang tìm kiếm, cảm ơn vì câu trả lời :)
AFract

IHtmlString như đã đề cập bởi @Jerad Rose là tốt hơn
Pratyush Dhanuka

37

Bạn nên sử dụng IHtmlStringthay thế:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

Bất cứ khi nào bạn có các thuộc tính mô hình hoặc các biến cần giữ HTML, tôi cảm thấy đây là một cách thực hành tốt hơn. Trước hết, nó sạch hơn một chút. Ví dụ:

@Html.Raw(str)

So với:

@str

Ngoài ra, tôi cũng nghĩ rằng nó an toàn hơn một chút so với việc sử dụng @Html.Raw(), vì mối quan tâm về việc dữ liệu của bạn có phải là HTML được giữ trong bộ điều khiển của bạn hay không. Trong một môi trường mà bạn có các nhà phát triển front-end so với back-end, các nhà phát triển back-end của bạn có thể hòa hợp hơn với những dữ liệu nào có thể chứa các giá trị HTML, do đó giữ mối quan tâm này trong back-end (controller).

Tôi thường cố gắng tránh sử dụng Html.Raw()bất cứ khi nào có thể.

Một điều đáng chú ý khác, là tôi không chắc bạn đang chỉ định ở đâu str, nhưng có một số điều khiến tôi quan tâm là cách bạn có thể thực hiện điều này.

Đầu tiên, điều này nên được thực hiện trong bộ điều khiển, bất kể giải pháp của bạn ( IHtmlStringhoặc Html.Raw). Bạn nên tránh bất kỳ logic nào như thế này theo quan điểm của bạn, vì nó không thực sự thuộc về đó.

Ngoài ra, bạn nên sử dụng của bạn ViewModelđể nhận các giá trị cho chế độ xem của bạn (và một lần nữa, lý tưởng IHtmlStringlà sử dụng làm loại thuộc tính). Nhìn thấy một cái gì đó giống như @Html.Encode(str)là một chút lo lắng, trừ khi bạn làm điều này chỉ để đơn giản hóa ví dụ của bạn.


1
Tôi muốn chỉ ra rằng bộ điều khiển là để định tuyến chứ không phải lưu trữ dữ liệu. Ngoài ra, các nhà phát triển hỗ trợ của bạn nên biết rõ hơn bao giờ hết việc thay đổi hợp đồng hiện tại của mã. Giao diện người dùng phải được ràng buộc với một mô hình và nếu mô hình đó thay đổi đáng kể, các thử nghiệm đơn vị của bạn sẽ bị phá vỡ.
Anthony Mason

Cảm ơn câu trả lời của bạn. Tôi thích nó.
Thomas.Benz

Vâng câu trả lời này là tốt hơn nhiều, tôi ban đầu sử dụng Html.Raw, nhưng khi tôi đọc câu trả lời này, tôi chuyển ngay lập tức
Pratyush Dhanuka

7

bạn có thể dùng @Html.Raw(str)

Xem MSDN để biết thêm

Trả về đánh dấu không được mã hóa HTML.

Phương thức này kết thúc đánh dấu HTML bằng cách sử dụng lớp IHtmlString, lớp này hiển thị HTML không được mã hóa.


1

Tôi đã gặp sự cố tương tự với các trường nhập HTML trong MVC. Trang web chỉ hiển thị từ khóa đầu tiên của trường. Ví dụ: trường nhập: "Cáo nâu nhanh nhẹn" Giá trị được hiển thị: "The"

Giải pháp là đặt biến trong dấu ngoặc kép trong câu lệnh giá trị như sau:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">

0

Tôi đã gặp vấn đề tương tự gần đây và google đã đưa tôi đến đây, vì vậy tôi đặt câu trả lời này ở đây trong trường hợp những người khác cũng hạ cánh ở đây, cho đầy đủ.

Tôi nhận thấy rằng khi tôi định dạng html sai , tôi thực sự đã loại bỏ tất cả các thẻ html của mình , chỉ còn lại nội dung không phải thẻ . Tôi đặc biệt có một bảng bị thiếu thẻ mở bảng và sau đó tất cả các thẻ html của tôi từ toàn bộ chuỗi bị tách ra hoàn toàn.

Vì vậy, nếu cách trên không hiệu quả và bạn vẫn đang vò đầu bứt tai, thì hãy kiểm tra xem html của bạn có hợp lệ không.

Tôi nhận thấy ngay cả sau khi tôi làm cho nó hoạt động, MVC đã thêm thẻ tbody mà tôi không có. Điều này cho tôi biết đang có quá trình dọn dẹp (MVC 5) và khi nó không thể xảy ra, nó sẽ loại bỏ tất cả / một số thẻ.

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.