2013-07-11 10 views
8

MVC4 Rasierer Ansicht. Da ein String backgroundImage wird wie folgt festgelegt:@ Html.Raw besteht auf die Codierung von Anführungszeichen

backgroundImage = string.Format("background: url('{0}') top left no-repeat;", project.MainImage); 

Warum ist das

<div class="spotlight slide teaser-text" id="@slideId" style="@Html.Raw(backgroundImage)"> 

<div class="spotlight slide teaser-text" id="spotlight-0" style="background: url(&#39;/media/215/spotlight01.jpg&#39;) top left no-repeat;"> 

Html.Raw, new MvcHtmlString und MvcHtmlString.Create alle ähnlich verhalten produzieren.

Ich würde erwarten es

<div class="spotlight slide teaser-text" id="spotlight-0" style="background: url('/media/215/spotlight01.jpg') top left no-repeat;"> 

(beachten Sie die Anführungszeichen) zu produzieren.

+0

'Html.Raw()' gibt nur einen 'HtmlString' zurück und' MvcHtmlString' erweitert 'HtmlString'; Ich denke, was du siehst, wird erwartet? – kenchilada

+0

@radium: Nein; Der springende Punkt ist, Flucht zu verhindern. – SLaks

+0

Ich habe es gerade auf MVC3 versucht und die erwarteten Ergebnisse bekommen (Ich habe MVC4 nicht auf diesem Rechner). Vielleicht hat es sich in 4 geändert. –

Antwort

3

Ich habe mir die kompilierte DLL für eine Rasierklingenvorlage angesehen, die dieses Markup enthält. Soweit ich sehen kann, ist das Problem das.

Html.Raw verwandelt eine Zeichenfolge in eine HtmlString. HttpUtility.HtmlEncode behandelt IHtmlString Instanzen anders als normale Zeichenfolgen, da es keine HTML-Codierung anwendet.

Wenn die programmatisch definierten Zeichenfolge in Zusammenhang mit dem Attribut gegeben ist, wird ein Anruf

this.WriteAttribute(...) 

mit Daten entsprechenden erzeugen um das Attribut zu

gemacht. Ein Teil dieser Daten ist der HtmlString, der durch den Aufruf von Html.Raw generiert wird. Ein anderer Teil ist ein Flag, das anzeigt, dass der Wert kein Literal ist.

Aufgrund des Nicht-Literal-Flagstatus ruft die WriteAttribute-Methode schließlich HtmlEncode auf. Aber es ruft diese nicht über die HtmlString, sondern über die Zeichenfolge Wert dieses Objekts. Sie haben also einen HTML-codierten Wert in der Ausgabe.

Außerhalb Rahmen eines Attributs, wird der Anruf an

this.Write(...) 

gemacht und dies aus dem gleichen Problem nicht leiden. Es scheint mir also ein Fehler zu sein (zumindest wenn ich es genau durchgespielt habe).

Verwandte Themen