Zeigen Sie die Zeichenfolge in der MVC-Ansicht von asp.net als HTML an

98

Ich habe einen Controller, der eine Zeichenfolge mit HTML-Markups generiert. Wenn ich sie jetzt in Ansichten anzeige, wird sie als einfache Zeichenfolge mit allen Tags angezeigt. Ich habe versucht, den HTML-Helfer zum Codieren / Decodieren zu verwenden, um es richtig anzuzeigen, aber es funktioniert nicht.

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

Nach meinen Ansichten

@Html.Encode(str)
Mukesh Sharma
quelle
6
Ich denke Html.Rawsollte helfen.
Saeed Neamati
Ich denke auch, dass Sie HtmlStrinKlasse verwenden können, wie inHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Antworten:

168

Sie sind nah dran, was Sie verwenden möchten @Html.Raw(str)

@Html.Encodenimmt Zeichenfolgen und stellt sicher, dass alle Sonderzeichen richtig behandelt werden. Dazu gehören Zeichen wie Leerzeichen.

Jared
quelle
6
@ Html.Raw ist genau das, wonach ich gesucht habe, danke für die Antwort :)
AFract
IHtmlString, wie von @Jerad Rose erwähnt, ist viel besser
Pratyush Dhanuka
37

Sie sollten IHtmlStringstattdessen verwenden:

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

Wenn Sie Modelleigenschaften oder Variablen haben, die HTML enthalten müssen, ist dies meiner Meinung nach im Allgemeinen eine bessere Vorgehensweise. Erstens ist es etwas sauberer. Beispielsweise:

@Html.Raw(str)

Verglichen mit:

@str

Ich denke auch, dass es ein bisschen sicherer @Html.Raw()ist als die Verwendung , da die Sorge, ob Ihre Daten HTML sind, in Ihrem Controller gespeichert bleibt. In einer Umgebung, in der Sie Front-End- und Back-End-Entwickler haben, sind Ihre Back-End-Entwickler möglicherweise besser auf die Daten abgestimmt, die HTML-Werte enthalten können, sodass dieses Problem im Back-End (Controller) verbleibt.

Ich versuche generell zu vermeiden, Html.Raw()wann immer möglich.

Eine andere erwähnenswerte Sache ist, dass ich nicht sicher bin, wo Sie sie zuweisen str, aber ein paar Dinge, die mich betreffen, wie Sie dies möglicherweise umsetzen.

Dies sollte zunächst in einem Controller erfolgen, unabhängig von Ihrer Lösung ( IHtmlStringoder Html.Raw). Sie sollten eine solche Logik aus Ihrer Sicht vermeiden, da sie dort nicht wirklich hingehört.

Darüber hinaus sollten Sie Ihre verwenden ViewModel, um Werte für Ihre Ansicht zu erhalten (und idealerweise auch IHtmlStringals Eigenschaftstyp verwenden). So etwas zu sehen @Html.Encode(str)ist ein wenig besorgniserregend, es sei denn, Sie haben dies nur getan, um Ihr Beispiel zu vereinfachen.

Jerad Rose
quelle
1
Ich möchte darauf hinweisen, dass Controller für das Routing und nicht für die Datenspeicherung vorgesehen sind. Darüber hinaus sollten Ihre Back-End-Entwickler besser wissen, als jemals den bestehenden Vertrag des Codes zu ändern. Die Benutzeroberfläche sollte an ein Modell gebunden sein. Wenn sich das Modell so drastisch ändert, sollten Ihre Komponententests unterbrochen werden.
Anthony Mason
Danke für deine Antwort. Ich mag das.
Thomas.Benz
Ja, diese Antwort ist viel besser, ich habe ursprünglich Html.Raw verwendet, aber als ich diese Antwort las, wechselte ich sofort
Pratyush Dhanuka
7

Sie können verwenden @Html.Raw(str)

Siehe MSDN für mehr

Gibt Markup zurück, das nicht HTML-codiert ist.

Diese Methode umschließt das HTML-Markup mit der IHtmlString-Klasse, die nicht codiertes HTML rendert.

AthibaN
quelle
1

Ich hatte ein ähnliches Problem mit HTML-Eingabefeldern in MVC. Auf der Webseite wurde nur das erste Schlüsselwort des Felds angezeigt. Beispiel: Eingabefeld: "Der schnelle Braunfuchs" Angezeigter Wert: "Der"

Die Lösung bestand darin, die Variable in der value-Anweisung wie folgt in Anführungszeichen zu setzen:

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

Ich hatte kürzlich ein ähnliches Problem und Google hat mich hier gelandet. Der Vollständigkeit halber habe ich diese Antwort hier eingefügt, falls auch andere hier landen.

Ich bemerkte, dass, als ich HTML schlecht formatiert hatte , tatsächlich alle meine HTML-Tags entfernt wurden , wobei nur der Nicht-Tag-Inhalt übrig blieb . Ich hatte insbesondere eine Tabelle mit einem fehlenden Tag für die öffnende Tabelle, und dann wurden alle meine HTML-Tags aus der gesamten Zeichenfolge vollständig herausgerissen.

Wenn das oben genannte nicht funktioniert und Sie sich immer noch am Kopf kratzen, überprüfen Sie auch, ob HTML gültig ist.

Ich stelle fest, dass MVC, selbst nachdem ich es zum Laufen gebracht hatte, tbody-Tags hinzufügte, bei denen ich keine hatte. Dies sagt mir, dass eine Bereinigung stattfindet (MVC 5) und dass, wenn dies nicht möglich ist, alle / einige Tags entfernt werden.

Greg
quelle