Senden nicht codierter Zeichenfolgen in einer Razor-Ansicht

81

Wie ScottGu in seinem Blog- Beitrag sagt, werden standardmäßig mit einem @ -Block ausgegebene Inhalte automatisch HTML-codiert, um einen besseren Schutz vor XSS-Angriffsszenarien zu gewährleisten. Meine Frage ist: Wie können Sie eine nicht HTML-codierte Zeichenfolge ausgeben?

Der Einfachheit halber halten Sie sich bitte an diesen einfachen Fall:

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

Antworten:

17

Sie können eine neue Instanz von MvcHtmlString erstellen, die nicht HTML-codiert wird.

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

Hoffentlich gibt es in Zukunft einen einfacheren Weg für Razor.

Wenn Sie MVC nicht verwenden, können Sie Folgendes versuchen:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
aolde
quelle
2
Eigentlich sollten Sie auch new HtmlString()in MVC 3 verwenden können, da dieser Typ .NET 4 ist.
Marcind
Tatsächlich! Wenn ich das alles in einen Ausdruck schreibe, mag ich die MVC noch einmal. ZB @ MvcHtmlString.Create (myString). Persönliche Präferenz!
Aolde
6

neuer HtmlString ist definitiv die Antwort.

Wir haben uns einige andere Änderungen der Rasierersyntax angesehen, aber letztendlich war keine davon wirklich kürzer als der neue HtmlString.

Wir können das jedoch in einen Helfer einwickeln. Möglicherweise...

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

oder

@"<p>something</p>".AsHtml()
Erik Porter
quelle
1
Wäre es möglich, @ = myString hinzuzufügen, um HTML auszugeben? Vielleicht ein zu großer Rückblick auf WebForms ...
aolde
2
Wir möchten vermeiden, Syntaxkonstrukte hinzuzufügen, die keinen wichtigen Benutzerfall abdecken. Meistens verwenden Sie Hilfsmethoden, um Zeichenfolgen zu erstellen, und IHtmlString funktioniert dort perfekt. Für die ungeraden Fälle, in denen Sie eine Literalzeichenfolge ohne Helfer ausgeben müssen, können wir eine Methode für Sie bereitstellen: @Literal (foo) oder ähnliches.
Andrew Stanton-Krankenschwester
0

Ich bin auch auf dieses Problem gestoßen, als ich unser Projekt auf die neue Razor View Engine umgestellt habe. Der Ansatz, den ich gewählt habe, war etwas anders, da wir JSON-Daten aus C # generieren mussten und diese beim Laden der Seite ausgeben wollten.

Was ich schließlich tat, war, eine RawView zu implementieren, die eine Parallele von View in den cshtml-Dateien war. Im Wesentlichen, um eine rohe Zeichenfolge zu erhalten,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Dies erfordert einige Änderungen an das Projekt - Layout, so dass ich nur eine Blog - Post über sie schrieb nach oben hier . Kurz gesagt, dies erforderte eine doppelte Implementierung des DynamicViewDataDictionary von MVC und eine neue WebViewPage, die RawView enthält. Ich habe auch den Indexoperator in RawView implementiert, um dies zu ermöglichen

@RawView["Foo"]

In dem Fall, dass jemand die Daten mit einer Liste von Schlüsseln durchlaufen muss.

Wenn ich den Kommentar von anurse gelesen hätte, wäre es wahrscheinlich besser gewesen, wenn ich dies als Literal anstelle von RawView bezeichnet hätte.

Anh-Kiet Ngo
quelle
0

Ich verwende ASP.NET MVC und Razor unter Mono.

Ich konnte HtmlHelper aus bestimmten Gründen nicht von System.Web.WebPages von System.Web.Mvc erhalten.

Aber ich habe es geschafft, eine nicht codierte Zeichenfolge auszugeben, nachdem ich die Eigenschaft des Modells als deklariert habe RazorEngine.Text.RawString. Jetzt wird wie erwartet ausgegeben.

Beispiel

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

Ausgabe:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
Porfirion
quelle