Renderowanie ASP.NET MVC Razor bez kodowania

250

Razor domyślnie koduje łańcuch. Czy jest jakaś specjalna składnia do renderowania bez kodowania?

SiberianGuy
źródło

Odpowiedzi:

374

Od wersji ASP.NET MVC 3 możesz używać:

@Html.Raw(myString)
Lucas
źródło
8
To nie jest do końca poprawne. Tak, możesz wstawić nieprzetworzony ciąg, ale jeśli go masz, "'<>etc...zostanie on zastąpiony znakami ucieczki. Prawidłowym sposobem jest użycie MvcHtmlString, który pozwoli na „nielegalne” znaki. Na przykład, jeśli kodujesz dane Jsona ... bez kodowania całego modelu
Daniel B. Chapman
4
Daniel, Html.Raw () „zwraca znaczniki, które nie są zakodowane w HTML”.
Lucas
1
Html.Raw () koduje cytaty ..."myAttr='hello';myInt=10"
Serge
4
NIE koduje cudzysłowów. Oprócz oczywistej dokumentacji stwierdzającej, że jest to zwykły dzień ( „Ta metoda otacza znaczniki HTML za pomocą klasy IHtmlString, która renderuje niezakodowany HTML.” ) Testowałem to i cytaty nie są kodowane.
James Wilkins,
58
@(new HtmlString(myString))
Matthew Vines
źródło
31

Oprócz wspomnianego już podejścia @ Html.Raw (string), jeśli wyślesz MvcHtmlString, nie zostanie on zakodowany. Może to być przydatne podczas dodawania własnych rozszerzeń do HtmlHelper lub podczas zwracania wartości z modelu widoku, o którym wiesz, że może zawierać HTML.

Na przykład, jeśli Twój model widoku to:

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

W przypadku Core 1.0+ (i MVC 5+) użyj HtmlString

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

następnie

<!-- 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
źródło
10

Należy @Html.Raw()zachować ostrożność, ponieważ może to spowodować więcej problemów z kodowaniem i bezpieczeństwem. Rozumiem przypadek użycia, ponieważ musiałem to zrobić sam, ale ostrożnie ... Po prostu unikaj przepuszczania całego tekstu. Na przykład zachowuj / konwertuj tylko określone sekwencje znaków i zawsze koduj resztę:

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

Dzięki temu masz pewność, że nie stworzyłeś potencjalnej luki w zabezpieczeniach, a znaki specjalne / obce są poprawnie wyświetlane we wszystkich przeglądarkach.

Tony Wall
źródło
+1 Dokładnie to, czego potrzebowałem! Ciąg nadal musi być zakodowany, ale znaki powrotu wiersza muszą mieć format HTML. Dzięki!
Peter
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))dla ASP.NET Core
kenjiuno
5

W przypadku ActionLink zazwyczaj używa HttpUtility.Encode na tekście łącza. W takim przypadku możesz użyć HttpUtility.HtmlDecode(myString) tego, który zadziałał dla mnie przy użyciu HtmlActionLink do dekodowania ciągu, który chciałem przekazać. na przykład:

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

gutsy_guy
źródło
1

Możesz także użyć metody WriteLiteral

Hamid Shahid
źródło
1

HTML RAW:

@Html.Raw(yourString)
Farbod
źródło