Emitowanie niezakodowanych ciągów w widoku Razor


81

Jak mówi ScottGu w swoim poście na blogu, „domyślnie treść emitowana przy użyciu bloku @ jest automatycznie kodowana w formacie HTML, aby lepiej chronić przed scenariuszami ataku XSS”. Moje pytanie brzmi: jak można wygenerować ciąg znaków inny niż HTML?

Ze względu na prostotę proszę trzymać się tego prostego przypadku:

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

Odpowiedzi:



17

Możesz utworzyć nową instancję MvcHtmlString, która nie zostanie zakodowana w formacie HTML.

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

Miejmy nadzieję, że w przyszłości Razor będzie łatwiejszy sposób.

Jeśli nie używasz MVC, możesz spróbować tego:

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

2
Właściwie możesz używać również new HtmlString()w MVC 3, ponieważ ten typ to .NET 4.
marcind

W rzeczy samej! Jednak wpisując to wszystko w jednym wyrażeniu, bardziej mi się podoba MVC. Np. @ MvcHtmlString.Create (myString). Osobiste preferencje!
aolde

6

new HtmlString jest zdecydowanie odpowiedzią.

Przyjrzeliśmy się innym zmianom w składni maszynki do golenia, ale ostatecznie żadna z nich nie była tak naprawdę krótsza niż nowy HtmlString.

Możemy jednak zawrzeć to w pomocniku. Możliwie...

@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 retrospekcji do
formularzy internetowych

2
Chcemy uniknąć dodawania konstrukcji składniowych, jeśli nie obejmują one dużego przypadku użytkownika. W większości przypadków będziesz używać metod pomocniczych do budowania ciągów, a IHtmlString działa tam doskonale. W nieparzystych przypadkach, w których musisz wyprowadzić ciąg znaków bez pomocy, możemy dostarczyć Ci metodę: @Literal (foo) lub podobną.
Andrew Stanton-Nurse

0

Napotkałem ten problem również podczas przenoszenia naszego projektu do nowego silnika widoku Razor. Podejście, które obrałem, było nieco inne, ponieważ musieliśmy generować dane JSON z C # i chcieliśmy je wyprowadzić po załadowaniu strony.

Ostatecznie zaimplementowałem RawView, który był paralelą z View w plikach cshtml. Zasadniczo, aby uzyskać nieprzetworzony ciąg,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Wymaga to kilku zmian w układzie projektu, dlatego właśnie napisałem o tym tutaj wpis na blogu . Krótko mówiąc, wymagało to zduplikowanej implementacji DynamicViewDataDictionary MVC i nowego WebViewPage, który zawiera RawView. Poszedłem również do przodu i zaimplementowałem operator indeksu w RawView, aby umożliwić

@RawView["Foo"]

Nie ma szans, że ktoś będzie potrzebował pętli danych z listą kluczy.

Czytając komentarz Anurse, prawdopodobnie byłoby lepiej, gdybym nazwał to literałem zamiast RawView.


0

Używam ASP.NET MVC i Razor w Mono.

Nie mogłem pobrać HtmlHelper z System.Web.WebPages z System.Web.Mvc z pewnych powodów.

Ale udało mi się wyprowadzić niezakodowany ciąg po zadeklarowaniu właściwości modelu jako RazorEngine.Text.RawString. Teraz wyprowadza zgodnie z oczekiwaniami.

Przykład

@{
    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>

Wynik:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.