Scrittura / output di stringhe HTML senza caratteri di escape


436

Ho HTML sicuro / disinfettato salvato in una tabella DB.

Come posso avere questo contenuto HTML scritto in una vista Razor?

Sfugge sempre a personaggi come <e e commerciali &amp;.


76
Per salvare le persone la lunga storia di discussioni di seguito -@Html.Raw()
Chris S,

Per salvare persone come me che provano a farlo con tipi anonimi in viste tipizzate dinamicamente, dove questo non funziona - vedi questa risposta alla mia domanda più specifica. Sebbene l'utilizzo di questo approccio con una visione fortemente tipizzata sia ancora migliore se la situazione lo consente.
brichins,

Risposte:


653

Supponiamo che il tuo contenuto sia all'interno di una stringa denominata mystring...

Puoi usare:

@Html.Raw(mystring)

In alternativa, puoi convertire la stringa in HtmlStringo qualsiasi altro tipo implementato IHtmlStringnel modello o direttamente in linea e utilizzare regolarmente @:

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

Grazie per questa risposta Mi ha aiutato a finire un piccolo compito che stavo imparando. :) Comunque sto usando l'ultima versione di MVC3 e finora nessun Html.Raw :(

1
Ciao Sergio Sto usando MVC 3 e sto usando correttamente il metodo Raw.
Gui,

1
Grazie per la risposta! Sto ancora imparando MVC 3 e questo mi stava sfuggendo.
Todd Richardson,

3
@Lorenzo, +1 Sto utilizzando l'ultimo MVC 3 con razorsintassi ed Html.Rawè sicuramente disponibile per me.
Chris Snowden,

1
Lorenzo, ho aggiornato la risposta per rimuovere la menzione di MVC Beta com'era qualche anno fa. Sentiti libero di ripristinare / cambiare.
Alexei Levenkov,

75

In ASP.NET MVC 3 Dovresti fare qualcosa del genere:

// 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
Preferisco questo metodo perché HTML.Raw esplode se la stringa passata è nulla.
37

1
Grazie, è molto pulito!
Hajjat,

64

Puoi usare

@{ WriteLiteral("html string"); }

5
Questo è stato fantastico per me, stava usando Razor all'interno di un'app Hangfire per inviare e-mail ... Html.Raw()non funziona lì
Shanabus,

1 per WriteLiteral
muhammed basil

11

A volte può essere difficile usare HTML grezzo. Principalmente a causa della vulnerabilità XSS. Se questo è un problema, ma vuoi comunque usare HTML grezzo, puoi codificare le parti spaventose.

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

Risultati in

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

4

Puoi mettere la tua stringa in viewdata nel controller in questo modo:

 ViewData["string"] = DBstring;

E poi chiama quel viewdata in questo modo:

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


0

Esempio completo per l'utilizzo delle funzioni del modello in RazorEngine (ad esempio per la generazione di 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.