Pisanie / wysyłanie ciągów HTML bez zmian


436

Mam bezpieczny / zdezynfekowany HTML zapisany w tabeli DB.

Jak mogę zapisać tę treść HTML w widoku Razor?

Zawsze ucieka przed znakami takimi jak <i do & &amp;.


76
Aby ocalić ludzi długą historię dyskusji poniżej -@Html.Raw()
Chris S

Aby uratować ludzi takich jak ja, próbujących to zrobić z anonimowymi typami w dynamicznie wpisywanych widokach, gdzie to nie zadziała - zobacz tę odpowiedź na moje bardziej szczegółowe pytanie. Chociaż stosowanie tego podejścia z silnie typowanym widokiem jest jeszcze lepsze, jeśli pozwala na to twoja sytuacja.
brichins,

Odpowiedzi:


653

Załóżmy, że treść znajduje się w ciągu o nazwie mystring...

Możesz użyć:

@Html.Raw(mystring)

Alternatywnie możesz przekonwertować ciąg na HtmlStringdowolny inny typ implementujący IHtmlStringw modelu lub bezpośrednio w wierszu i używać zwykłego @:

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

Dziękuję za tę odpowiedź. Pomógł mi ukończyć małe zadanie, którego się uczyłem. :) Jednak korzystam z najnowszej wersji MVC3 i jak dotąd nie mam HTML.Raw :(

1
Cześć Sergio. Używam MVC 3 i używam poprawnie metody Raw.
Gui,

1
Dziękuję za Twoją odpowiedź! Nadal uczę się MVC 3 i to mi umykało.
Todd Richardson,

3
@Lorenzo, +1 Używam najnowszego MVC 3 ze razorskładnią i Html.Rawjest dla mnie zdecydowanie dostępny.
Chris Snowden,

1
Lorenzo, zaktualizowałem odpowiedź, aby usunąć wzmiankę o MVC Beta, jak to było kilka lat temu. Możesz cofnąć / zmienić.
Aleksiej Lewenkow

75

W ASP.NET MVC 3 powinieneś zrobić coś takiego:

// 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
Wolę tę metodę, ponieważ HTML.Raw wysadza się w powietrze, jeśli przekazany ciąg ma wartość NULL.
37Stars

1
Dzięki, to jest bardzo czyste!
Hajjat,

64

Możesz użyć

@{ WriteLiteral("html string"); }

5
To było dla mnie niesamowite, używanie Razor w aplikacji Hangfire do wysyłania e-maili ... Html.Raw()tam nie działa
shanabus

1 dla WriteLiteral
basil

11

Czasami użycie surowego HTML może być trudne. Głównie z powodu podatności XSS. Jeśli jest to problem, ale nadal chcesz używać surowego HTML, możesz zakodować przerażające części.

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

Prowadzi do

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

4

Możesz umieścić swój ciąg w viewdata w kontrolerze w następujący sposób:

 ViewData["string"] = DBstring;

A następnie wywołaj te dane w widoku w następujący sposób:

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


0

Kompletny przykład użycia funkcji szablonów w RazorEngine (na przykład do generowania wiadomości e-mail):

@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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.