2010-07-28 20 views
76

Jak mówi ScottGu na swoim blogu post «treść domyślnie emitowana za pomocą bloku @ jest automatycznie kodowana w HTML, aby lepiej chronić się przed scenariuszami ataku XSS». Moje pytanie brzmi: jak można wyprowadzić łańcuch nie zakodowany w HTML?Emitowanie nieskodowanych ciągów w widoku Razor

Dla uproszczenia, pls trzymać się tej prostej sprawy:

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

Odpowiedz

17

Można utworzyć nową instancję MvcHtmlString które nie zostaną zakodowane HTML.

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

Mam nadzieję, że będzie łatwiejszy sposób na przyszłość maszynki Razor.

Jeśli nie używasz MVC, można spróbować to:

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

Właściwie sould można użyć 'nową HtmlString()' w MVC 3, a także od tego typu to .NET 4. – marcind

+0

Rzeczywiście! Jednak przy wpisywaniu wszystkiego w jednym wyrażeniu lubię MVC jeszcze bardziej. Na przykład. @ MvcHtmlString.Create (myString). Osobiste preferencje! – aolde

6

nowy HtmlString jest zdecydowanie odpowiedź.

Przyjrzeliśmy się innym zmianom składni maszynki do golenia, ale ostatecznie żaden z nich nie był tak naprawdę krótszy od nowego HtmlString.

Możemy jednak zawinąć to w pomocnika. Być może ...

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

lub

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

Czy byłoby możliwe dodanie @ = myString jako sposobu na wyjście HTML? Może za dużo flashbacków do WebForms ... – aolde

+2

Chcemy uniknąć dodawania konstruktów składni tam, gdzie nie obejmują one dużego przypadku użytkownika. Przez większość czasu będziesz używać metod pomocniczych do budowania ciągów, a IHtmlString działa tam doskonale. W przypadku nieparzystych przypadków, w których musisz wypisać ciąg literalny bez pomocnika, możemy podać metodę dla ciebie: @Literal (foo) lub podobną. –

0

wpadłem na ten problem, a także podczas przechodzenia naszego projektu do nowego silnika widoku Razor. Podejście, które podjąłem, było nieco inne, ponieważ musieliśmy wygenerować dane JSON z C# i chcieliśmy wyprowadzić je po załadowaniu strony.

Ostatecznie zaimplementowałem RawView, który był równoległy do ​​widoku wewnątrz plików cshtml. Zasadniczo, aby uzyskać surowy ciąg,

@(new HtmlString(View.Foo)) 

// became 
@RawView.Foo 

Wymaga to kilka zmian w układzie projektu, więc po prostu pisał się na blogu o tym here. W skrócie wymagało to zduplikowanej implementacji DynamicViewDataDictionary MVC i nowej strony WebViewPage zawierającej RawView. Ja też poszedł do przodu i wdrożone operatora indeksu na RawView aby umożliwić

@RawView["Foo"] 

w poza przypadkiem, że ktoś potrzebuje pętli nad danymi z listą kluczy.

Czytanie komentarza anurse, prawdopodobnie byłoby lepiej, gdybym nazwał to literałem zamiast RawView.

Powiązane problemy