Renderowanie ASP.NET MVC Razor bez kodowania


Odpowiedzi:


374

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

@Html.Raw(myString)

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,


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>

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.


+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",..)



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.