Was ist ein MvcHtmlString und wann sollte ich ihn verwenden?

Die Dokumentation für MvcHtmlString ist nicht besonders aufschlussreich:

Stellt eine HTML-codierte Zeichenfolge dar, die nicht erneut codiert werden sollte.

Es ist mir nicht klar, was genau das bedeutet. Es scheint, dass einige HTML- MvcHtmlString einen MvcHtmlString , aber einige Beispiele, die ich online von benutzerdefinierten Helfern gesehen habe, geben nur eine reguläre Zeichenkette zurück.

Fragen:

Was ist ein MvcHtmlString ?

Wann sollte ich MvcHtmlString über string wählen und umgekehrt? Warum?

ASP.NET 4 führt eine neue Code-Nugget-Syntax < %: %> . Im Wesentlichen wird < %: foo %> in < %= HttpUtility.HtmlEncode(foo) %> . Das Team versucht, Entwickler dazu zu bringen, möglichst < %: %> anstelle von < %= %> zu verwenden, um XSS zu verhindern.

Dies führt jedoch zu dem Problem, dass, wenn ein Code-Nugget sein Ergebnis bereits codiert, die < %: %> -Syntax es erneut codiert . Dies wird durch die Einführung der IHtmlString-Schnittstelle (neu in .NET 4) getriggers. Wenn der foo () in < %: foo() %> einen IHtmlString zurückgibt, wird die < %: %> -Syntax ihn nicht erneut codieren.

Die Helfer von MVC 2 geben MvcHtmlString zurück, was auf ASP.NET 4 das Interface IHtmlString implementiert. Wenn Entwickler daher in ASP.NET 4 < %: Html.*() %> , wird das Ergebnis nicht doppelt codiert.

Bearbeiten:

Ein sofortiger Vorteil dieser neuen Syntax ist, dass Ihre Ansichten ein wenig sauberer sind. Zum Beispiel können Sie < %: ViewData["anything"] %> statt < %= Html.Encode(ViewData["anything"]) %> .

Dies ist eine späte Antwort, aber wenn jemand diese Frage mit razor liest, sollten Sie daran denken, dass Rasierer alles standardmäßig kodiert, aber indem Sie MvcHtmlString in Ihren HTML-Helfern verwenden, können Sie Rasierer sagen, dass er es nicht verschlüsseln muss .

Wenn Sie möchten, dass der Rasierer keine Zeichenfolge codiert, verwenden Sie

 @Html.Raw("hi") 

Decompiling Raw (), zeigt uns, dass es die Zeichenfolge in einem HtmlString umschließt

 public IHtmlString Raw(string value) { return new HtmlString(value); } 

HtmlString existiert nur in ASP.NET 4.

MvcHtmlString war ein Kompatibilitäts-Shim, das zu MVC 2 hinzugefügt wurde, um sowohl .NET 3.5 als auch .NET 4 zu unterstützen. Jetzt, wo MVC 3 nur .NET 4 ist, ist es eine ziemlich triviale Unterklasse von HtmlString, vermutlich für MVC 2-> 3 für Quellkompatibilität. ” Quelle

Ein schöner praktischer Nutzen davon ist, wenn Sie Ihre eigenen HtmlHelper Erweiterungen machen wollen. Ich hasse es beispielsweise, mich an die -Tagsyntax zu erinnern, also habe ich meine eigene Erweiterungsmethode erstellt, um ein -Tag zu erstellen:

  _ Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString Dim tag = New TagBuilder("link") tag.MergeAttribute("type", "text/css") tag.MergeAttribute("rel", "stylesheet") tag.MergeAttribute("href", src) tag.MergeAttributes(New RouteValueDictionary(htmlAttributes)) Dim result = tag.ToString(TagRenderMode.Normal) Return MvcHtmlString.Create(result) End Function 

Ich hätte String von dieser Methode zurückgeben können, aber wenn ich folgendes hätte brechen lassen:

< %: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>

Mit MvcHtmlString Verwendung von entweder < %: ... %> oder < %= ... %> korrekt.

Sie würden einen MvcHtmlString wenn Sie Raw-HTML an eine MVC- MvcHtmlString möchten und nicht möchten, dass die MvcHtmlString HTML- MvcHtmlString codiert.