2010-07-28 8 views
76

Wie ScottGu in seinem Blog sagt post «Standardmäßig wird Inhalt, der mit einem @ -Block ausgegeben wird, automatisch HTML-kodiert, um besser gegen XSS-Angriffsszenarien zu schützen». Meine Frage ist: Wie können Sie eine nicht-HTML-codierte Zeichenfolge ausgeben?Emittieren von unverschlüsselten Zeichenketten in einer Razor-Ansicht

Aus Gründen der Einfachheit, kleben pls zu diesem einfachen Fall:

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

Antwort

17

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

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

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

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

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

Eigentlich sould Sie in der Lage sein 'neuen HtmlString zu verwenden()' in MVC 3 als auch seit dieser Art ist .NET 4. – marcind

+0

In der Tat! Aber wenn ich all das in einen Ausdruck tippe, mag ich den MVC noch einen. Z.B. @ MvcHtmlString.Create (myString). Persönliche Präferenz! – aolde

6

neue HtmlString ist definitiv die Antwort.

Wir haben uns einige andere Änderungen an der Rasierersyntax angeschaut, aber letztlich war keiner von ihnen wirklich kürzer als neuer HtmlString.

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

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

oder

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

Wäre es möglich, @ = myString hinzuzufügen, um HTML auszugeben? Vielleicht zu viel von einem Flashback zu WebForms ... – aolde

+2

Wir wollen vermeiden, dass Syntaxkonstrukte dort hinzugefügt werden, wo sie einen größeren Benutzerfall nicht abdecken. Meistens verwenden Sie Hilfsmethoden zum Erstellen von Strings und IHtmlString funktioniert dort perfekt. Für die wenigen Fälle, in denen Sie eine literale Zeichenfolge ohne Hilfsprogramm ausgeben müssen, können wir eine Methode für Sie bereitstellen: @Literal (foo) oder ähnliches. –

0

ich in dieses Problem lief so gut, wenn unser Projekt der neuen Razor Ansicht Motor Übergang. Der Ansatz, den ich nahm, war etwas anders, weil wir JSON-Daten aus C# generieren und beim Laden der Seite ausgeben wollten.

Was ich schließlich tat, war eine RawView zu implementieren, die eine Parallele von View innerhalb der cshtml-Dateien war. Im Wesentlichen um einen rohen String zu bekommen,

@(new HtmlString(View.Foo)) 

// became 
@RawView.Foo 

Dies erfordert einige Änderungen an das Projekt-Layout, so dass ich gerade geschrieben habe here darüber eine Blog-Post auf. Kurz gesagt, dies erforderte eine doppelte Implementierung von MVCs DynamicViewDataDictionary und eine neue WebViewPage, die RawView enthält. Ich ging auch voran und implementiert, um den Index-Operator auf dem RawView für

@RawView["Foo"] 

In der Off-Chance zu ermöglichen, dass jemand in einer Schleife über die Daten mit einer Liste von Schlüsseln benötigt.

Wenn ich den Kommentar eines Anurse gelesen habe, wäre es wahrscheinlich besser gewesen, wenn ich dies als Literal anstelle von RawView benannt hätte.