Schreiben / Ausgeben von HTML-Zeichenfolgen ohne Umgehung

436

Ich habe sicheres / bereinigtes HTML in einer DB-Tabelle gespeichert.

Wie kann ich diesen HTML-Inhalt in einer Razor-Ansicht ausschreiben lassen?

Es entgeht immer Zeichen wie <und kaufmännisches Und &amp;.

AGS
quelle
76
Um Menschen die lange Geschichte der Diskussion unten zu retten -@Html.Raw()
Chris S
Um Leute wie mich zu retten, die versuchen, dies mit anonymen Typen in dynamisch getippten Ansichten zu tun, wo dies nicht funktioniert, lesen Sie diese Antwort auf meine spezifischere Frage. Obwohl die Verwendung dieses Ansatzes mit einer stark typisierten Ansicht immer noch besser ist, wenn Ihre Situation dies zulässt.
Brichins

Antworten:

653

Angenommen, Ihr Inhalt befindet sich in einer Zeichenfolge mit dem Namen mystring...

Sie können verwenden:

@Html.Raw(mystring)

Alternativ können Sie Ihre Zeichenfolge in HtmlStringeinen anderen Typ konvertieren , der IHtmlStringim Modell oder direkt inline implementiert ist, und regulär verwenden @:

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString
Lorenzo
quelle
Danke für diese Antwort. Hat mir geholfen, eine kleine Aufgabe zu erledigen, die ich gerade gelernt habe. :) Allerdings benutze ich die neueste Version von MVC3 und bisher kein Html.Raw :(
1
Hallo Sergio. Ich benutze MVC 3 und ich benutze die Raw-Methode richtig.
Gui
1
Danke für die Antwort! Ich lerne immer noch MVC 3 und das entging mir.
Todd Richardson
3
@ Lorenzo, +1 Ich verwende die neueste MVC 3 mit razorSyntax und Html.Rawsteht mir definitiv zur Verfügung.
Chris Snowden
1
Lorenzo, ich habe die Antwort aktualisiert, um die Erwähnung von MVC Beta wie vor einigen Jahren zu entfernen. Fühlen Sie sich frei, zurückzusetzen / zu ändern.
Alexei Levenkov
75

In ASP.NET MVC 3 sollten Sie Folgendes tun:

// 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)
Tom Chantler
quelle
13
Ich bevorzuge diese Methode, weil HTML.Raw explodiert, wenn die übergebene Zeichenfolge null ist.
37Stars
1
Danke, das ist sehr sauber!
Hajjat
64

Sie können verwenden

@{ WriteLiteral("html string"); }
Andrus
quelle
5
Das war großartig für mich, ich habe Razor in einer Hangfire-App verwendet, um E-Mails zu senden ... Html.Raw()funktioniert dort nicht
Shanabus
1 für WriteLiteral
Muhammed Basilikum
11

Manchmal kann es schwierig sein, rohes HTML zu verwenden. Hauptsächlich wegen der XSS-Sicherheitslücke. Wenn dies ein Problem darstellt, Sie aber dennoch rohes HTML verwenden möchten, können Sie die beängstigenden Teile codieren.

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

Ergebnisse in

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

Sie können Ihre Zeichenfolge wie folgt in Ansichtsdaten im Controller einfügen:

 ViewData["string"] = DBstring;

Rufen Sie diese Ansichtsdaten dann folgendermaßen auf:

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

Vollständiges Beispiel für die Verwendung von Vorlagenfunktionen in RazorEngine (z. B. zur E-Mail-Generierung):

@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>
ZlobnyiSerg
quelle