2010-07-28 13 views
76

Come dice ScottGu nel suo blog post «per impostazione predefinita il contenuto emesso utilizzando un blocco @ è automaticamente codificato in HTML per una migliore protezione dagli scenari di attacco XSS». La mia domanda è: come si può produrre una stringa non codificata in HTML?Emissione di stringhe non codificate in modalità Razor

Per ragioni di semplicità, pls attenersi a questo semplice caso:

@{ 
var html = "<a href='#'>Click me</a>" 
// I want to emit the previous string as pure HTML code... 
} 

risposta

17

è possibile creare una nuova istanza di MvcHtmlString che non verrà codificato HTML.

@{ 
    var html = MvcHtmlString.Create("<a href='#'>Click me</a>") 
} 

Speriamo che ci sarà un modo più semplice per il futuro di Rasoio.

Se non stai usando MVC, si può provare questo:

@{ 
    var html = new HtmlString("<a href='#'>Click me</a>") 
} 
+2

In realtà si sould essere in grado di usare 'nuova HtmlString()' in MVC 3 e da quel tipo è .NET 4. – marcind

+0

Infatti! Tuttavia quando digito tutto ciò in una espressione mi piace l'MVC in più. Per esempio. @ MvcHtmlString.Create (myString). Preferenza personale! – aolde

6

nuova HtmlString è sicuramente la risposta.

Abbiamo esaminato alcune altre modifiche alla sintassi del rasoio, ma alla fine nessuno di questi è risultato essere più corto del nuovo HtmlString.

Possiamo, tuttavia, avvolgerlo in un aiutante. Forse ...

@Html.Literal("<p>something</p>") 

o

@"<p>something</p>".AsHtml() 
+1

Sarebbe possibile aggiungere @ = myString come metodo per emettere l'HTML? Forse troppo di un flashback per WebForms ... – aolde

+2

Vogliamo evitare di aggiungere costrutti di sintassi in cui non coprono un caso utente principale. La maggior parte delle volte userete metodi di supporto per costruire stringhe e IHtmlString funziona perfettamente lì. Per i casi strani in cui è necessario produrre una stringa letterale senza un helper, possiamo fornire un metodo per te: @Literal (foo) o simile. –

0

mi sono imbattuto in questo problema così quando si passa il nostro progetto per il nuovo motore di visualizzazione Razor. L'approccio che ho preso era leggermente diverso perché dovevamo generare i dati JSON da C# e volevamo farlo uscire al caricamento della pagina.

Quello che alla fine ho fatto è stato implementare un RawView che era un parallelo di Vista all'interno dei file cshtml. In sostanza, per ottenere una stringa grezzo,

@(new HtmlString(View.Foo)) 

// became 
@RawView.Foo 

Ciò richiede alcune modifiche al layout del progetto, così ho appena scritto un post sul blog su di esso here. In breve, ciò richiedeva un'implementazione duplicata di DynamicViewDataDictionary di MVC e una nuova pagina WebView contenente RawView. Sono anche andato avanti e implementato l'operatore indice sul RawView per consentire

@RawView["Foo"] 

Nella remota possibilità che qualcuno ha bisogno di un ciclo sui dati con un elenco di chiavi.

Leggendo il commento di un infermiere, probabilmente sarebbe stato meglio se avessi chiamato questo come Letterale anziché RawView.

Problemi correlati