ASP.NET MVC Razor wird ohne Codierung gerendert

250

Razor codiert standardmäßig Zeichenfolgen. Gibt es eine spezielle Syntax für das Rendern ohne Codierung?

SiberianGuy
quelle

Antworten:

374

Seit ASP.NET MVC 3 können Sie Folgendes verwenden:

@Html.Raw(myString)
Lucas
quelle
8
Das ist nicht ganz richtig. Ja, Sie können eine Rohzeichenfolge einfügen, aber wenn Sie "'<>etc...diese haben, werden sie maskiert. Der richtige Weg ist die Verwendung des MvcHtmlString, der "unzulässige" Zeichen zulässt. Zum Beispiel, wenn Sie Json-Daten codieren ... ohne ein ganzes Modell zu codieren
Daniel B. Chapman
4
Daniel, Html.Raw () "gibt Markup zurück, das nicht HTML-codiert ist."
Lucas
1
Html.Raw () codiert die Anführungszeichen ..."myAttr='hello';myInt=10"
Serge
4
Es werden KEINE Anführungszeichen codiert. Neben der offensichtlichen Dokumentation, die es einfach als Tag angibt ( "Diese Methode umschließt das HTML-Markup mit der IHtmlString-Klasse, die nicht codiertes HTML rendert ." ) , Habe ich dies auch getestet und Anführungszeichen werden nicht codiert.
James Wilkins
58
@(new HtmlString(myString))
Matthew Vines
quelle
31

Wenn Sie einen MvcHtmlString ausgeben, wird dieser nicht wie der bereits erwähnte @ Html.Raw (String) -Ansatz codiert. Dies kann hilfreich sein, wenn Sie dem HtmlHelper eigene Erweiterungen hinzufügen oder wenn Sie einen Wert aus Ihrem Ansichtsmodell zurückgeben, von dem Sie wissen, dass er HTML enthält.

Zum Beispiel, wenn Ihr Ansichtsmodell war:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}

Verwenden Sie für Core 1.0+ (und MVC 5+) HtmlString

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}

dann

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>
Jonathan Moffatt
quelle
10

Seien Sie @Html.Raw()vorsichtig, da dies zu größeren Problemen bei der Codierung und Sicherheit führen kann. Ich verstehe den Anwendungsfall, da ich dies selbst tun musste, aber vorsichtig ... Vermeiden Sie einfach, den gesamten Text durchzulassen. Zum Beispiel nur bestimmte Zeichenfolgen beibehalten / konvertieren und immer den Rest codieren:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

Dann können Sie sicher sein, dass Sie keine potenzielle Sicherheitslücke erstellt haben und Sonder- / Fremdzeichen in allen Browsern korrekt angezeigt werden.

Tony Wall
quelle
+1 Genau das, was ich brauchte! Die Zeichenfolge muss noch codiert werden, aber die Zeilenrückgabe muss HTML sein. Vielen Dank!
Peter
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))für ASP.NET Core
Kenjiuno
5

Bei ActionLink wird im Allgemeinen HttpUtility.Encode für den Linktext verwendet. In diesem Fall können Sie es verwenden HttpUtility.HtmlDecode(myString) , wenn ich mit HtmlActionLink die Zeichenfolge dekodiere, die ich übergeben möchte. z.B:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)

gutsy_guy
quelle
1

Sie können auch die WriteLiteral-Methode verwenden

Hamid Shahid
quelle
1

HTML RAW:

@Html.Raw(yourString)
Farbod
quelle