Visualizza la stringa come html nella vista asp.net mvc


98

Ho un controller che genera una stringa contenente markup html. Ora quando lo mostro nelle viste, viene visualizzato come una semplice stringa contenente tutti i tag. Ho provato a utilizzare l'helper Html per codificare / decodificare per visualizzarlo correttamente, ma non funziona.

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

Secondo le mie opinioni,

@Html.Encode(str)

6
Immagino Html.Rawdovrebbe aiutare.
Saeed Neamati

Inoltre penso che tu possa usare la HtmlStrinclasse, come inHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Risposte:


168

Sei vicino che vuoi usare @Html.Raw(str)

@Html.Encodeaccetta stringhe e garantisce che tutti i caratteri speciali siano gestiti correttamente. Questi includono caratteri come gli spazi.


6
@ Html.Raw è esattamente quello che stavo cercando, grazie per la risposta :)
AFract

IHtmlString come menzionato da @Jerad Rose è molto meglio
Pratyush Dhanuka

37

Dovresti IHtmlStringinvece usare :

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>");

Ogni volta che hai proprietà del modello o variabili che devono contenere HTML, ritengo che questa sia generalmente una pratica migliore. Prima di tutto, è un po 'più pulito. Per esempio:

@Html.Raw(str)

Rispetto a:

@str

Inoltre, penso anche che sia un po 'più sicuro rispetto all'uso @Html.Raw(), poiché la preoccupazione di sapere se i tuoi dati sono HTML è conservata nel tuo controller. In un ambiente in cui hai sviluppatori front-end e back-end, i tuoi sviluppatori back-end potrebbero essere più in sintonia con i dati che possono contenere valori HTML, mantenendo così questa preoccupazione nel back-end (controller).

In genere cerco di evitare di utilizzare Html.Raw()quando possibile.

Un'altra cosa che vale la pena notare, è che non sono sicuro di dove stai assegnando str, ma alcune cose che mi preoccupano di come potresti implementarlo.

Innanzitutto, questo dovrebbe essere fatto in un controller, indipendentemente dalla soluzione ( IHtmlStringo Html.Raw). Dovresti evitare qualsiasi logica come questa dal tuo punto di vista, poiché in realtà non appartiene a lì.

Inoltre, dovresti usare il tuo ViewModelper ottenere i valori dalla tua vista (e di nuovo, idealmente usando IHtmlStringcome tipo di proprietà). Vedere qualcosa di simile @Html.Encode(str)è un po 'preoccupante, a meno che tu non lo stia facendo solo per semplificare il tuo esempio.


1
Vorrei sottolineare che i controller servono per il routing e non per l'archiviazione dei dati. Inoltre, i tuoi sviluppatori back-end dovrebbero sapere meglio che cambiare il contratto esistente del codice. L'interfaccia utente dovrebbe essere associata a un modello e, se il modello cambia drasticamente, i test unitari dovrebbero interrompersi.
Anthony Mason

Grazie per la tua risposta. Mi piace.
Thomas.Benz

Sì, questa risposta è molto meglio, inizialmente ho usato Html.Raw, ma quando ho letto questa risposta, sono passato immediatamente
Pratyush Dhanuka

7

Puoi usare @Html.Raw(str)

Vedi MSDN per ulteriori informazioni

Restituisce markup che non è codificato in HTML.

Questo metodo esegue il wrapping del markup HTML utilizzando la classe IHtmlString, che esegue il rendering di HTML non codificato.


1

Ho avuto un problema simile con i campi di input HTML in MVC. La pagina web mostrava solo la prima parola chiave del campo. Esempio: campo di input: "The quick brown fox" Valore visualizzato: "The"

La risoluzione era di mettere la variabile tra virgolette nella dichiarazione del valore come segue:

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

0

Ho avuto un problema simile recente e Google mi ha fatto atterrare qui, quindi ho messo questa risposta qui nel caso in cui altri arrivassero anche qui, per completezza.

Ho notato che quando avevo un html formattato male , in realtà stavo avendo tutti i miei tag html rimossi , con solo il contenuto senza tag rimanente . In particolare, avevo una tabella con un tag di tabella di apertura mancante e quindi tutti i miei tag html dall'intera stringa sono stati strappati completamente.

Quindi, se quanto sopra non funziona e ti stai ancora grattando la testa, controlla anche che il tuo html sia valido.

Ho notato che anche dopo averlo fatto funzionare, MVC aggiungeva tag tbody dove non ne avevo nessuno. Questo mi dice che è in corso la pulizia (MVC 5) e che quando non può accadere, rimuove tutti / alcuni tag.

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.