Thomas Bandt

Über mich | Kontakt | Archiv

ASP.NET MVC 3 - HTMLEncode() für eigene Extensions vermeiden

Kleiner Schock nach der Umstellung vorhandenen Codes von MVC 1 oder 2 auf MVC 3: der in eigenen Extension-Methods generierte HTML-Code wird plötzlich in der Website lesbar dargestellt. Was passiert da?

MVC 3 sorgt einfach per default dafür, dass dieser Code durch die HTMLEncode-Methode wandert. Das ist an sich eine gute Sache, weil sie Anfälligkeiten für XSS etc. verringert (wenn auch nicht ganz ausschließt).

Was hilft ist die Verwendung von IHtmlString an Stelle von String. So wird aus

   1:  public static string Stylesheet(this HtmlHelper htmlHelper, string stylesheetName)
   2:  {
   3:      return string.Format("<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />", 
   4:          VirtualPathUtility.ToAbsolute("~/Static/" + stylesheetName) + "?" + 
   5:          DateTime.Now.ToString("yyyyMMddHHmmssffff"));
   6:  }

dann

   1:  public static IHtmlString Stylesheet(this HtmlHelper htmlHelper, string stylesheetName)
   2:  {
   3:      return MvcHtmlString.Create(string.Format("<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />", 
   4:          VirtualPathUtility.ToAbsolute("~/Static/" + stylesheetName) + "?" + 
   5:          DateTime.Now.ToString("yyyyMMddHHmmssffff")));
   6:  }

und schon geht's wieder :-).

Kommentare

  1. Albert Weinert schrieb am Montag, 20. Dezember 2010 23:21:00 Uhr:

    Nur der Vollständigkeit wegen.

    Dies hat nicht mit MVC 3 zu tun.

    Dies ist eine Sache der ViewEngine, Razor macht eben bei @foo auf alle ein HtmlEncode(), ebenso wie WebForms 4 mit <%: foo %>.

    Nutzt man MVC 2 mit .NET 4 und die <%: foo %> Syntax (default bei neuen .NET 4 MVC 2 projekten) anstatt der <%= foo %> so "passiert" dies auch.
    Nur dass die unter MVC2 nicht IHtmlString, sondern MvcHtmlString ist.
  2. Thomas schrieb am Montag, 20. Dezember 2010 23:23:00 Uhr:

    Na ja ;) Razor gibt's in MVC2 nicht, also ist es ein MVC3-"Feature". Für <%: %> statt <%= %> muss man sich ja explizit entscheiden.
  3. Marcus schrieb am Mittwoch, 13. Juni 2012 15:49:00 Uhr:

    Hallo Thomas,
    wenn Du das Encode umgehen möchtest, verwende @Html.Raw("My String")


« Zurück  |  Weiter »