Razor codiert standardmäßig Zeichenfolgen. Gibt es eine spezielle Syntax für das Rendern ohne Codierung?
Razor codiert standardmäßig Zeichenfolgen. Gibt es eine spezielle Syntax für das Rendern ohne Codierung?
Antworten:
Seit ASP.NET MVC 3 können Sie Folgendes verwenden:
@Html.Raw(myString)
"myAttr='hello';myInt=10"
@(new HtmlString(myString))
Wenn Sie einen MvcHtmlString ausgeben, wird dieser nicht wie der bereits erwähnte @ Html.Raw (String) -Ansatz codiert. Dies kann hilfreich sein, wenn Sie dem HtmlHelper eigene Erweiterungen hinzufügen oder wenn Sie einen Wert aus Ihrem Ansichtsmodell zurückgeben, von dem Sie wissen, dass er HTML enthält.
Zum Beispiel, wenn Ihr Ansichtsmodell war:
public class SampleViewModel
{
public string SampleString { get; set; }
public MvcHtmlString SampleHtmlString { get; set; }
}
Verwenden Sie für Core 1.0+ (und MVC 5+) HtmlString
public class SampleViewModel
{
public string SampleString { get; set; }
public HtmlString SampleHtmlString { get; set; }
}
dann
<!-- 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>
Seien Sie @Html.Raw()
vorsichtig, da dies zu größeren Problemen bei der Codierung und Sicherheit führen kann. Ich verstehe den Anwendungsfall, da ich dies selbst tun musste, aber vorsichtig ... Vermeiden Sie einfach, den gesamten Text durchzulassen. Zum Beispiel nur bestimmte Zeichenfolgen beibehalten / konvertieren und immer den Rest codieren:
@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))
Dann können Sie sicher sein, dass Sie keine potenzielle Sicherheitslücke erstellt haben und Sonder- / Fremdzeichen in allen Browsern korrekt angezeigt werden.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))
für ASP.NET Core
Bei ActionLink wird im Allgemeinen HttpUtility.Encode für den Linktext verwendet. In diesem Fall können Sie es verwenden
HttpUtility.HtmlDecode(myString)
, wenn ich mit HtmlActionLink die Zeichenfolge dekodiere, die ich übergeben möchte. z.B:
@Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
Sie können auch die WriteLiteral-Methode verwenden
"'<>etc...
diese haben, werden sie maskiert. Der richtige Weg ist die Verwendung des MvcHtmlString, der "unzulässige" Zeichen zulässt. Zum Beispiel, wenn Sie Json-Daten codieren ... ohne ein ganzes Modell zu codieren