Razor domyślnie koduje łańcuch. Czy jest jakaś specjalna składnia do renderowania bez kodowania?
Razor domyślnie koduje łańcuch. Czy jest jakaś specjalna składnia do renderowania bez kodowania?
Odpowiedzi:
Od wersji ASP.NET MVC 3 możesz używać:
@Html.Raw(myString)
"myAttr='hello';myInt=10"
@(new HtmlString(myString))
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>
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.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))
dla ASP.NET Core
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",..)
Możesz także użyć metody WriteLiteral
"'<>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