2017-06-08 1 views
0

Ich habe eine Ansicht ASP.NET MVC-Modell, das ich auf eine JavaScript-Funktion, wenn die Seite geladen werden übergeben müssen, und ich bin derzeit dabei, dass in etwa so:Wie wird eine JSON-Zeichenfolge mit HTML-Zeichen codiert?

<script type="text/javascript"> 
    $(window).on("load", function() { 
     myFunction(@Html.Raw(JsonConvert.SerializeObject(Model))); 
    }); 
</script> 

Mit anderen Worten, ich bin mit JSON.NET, um das Modell zu JSON zu serialisieren und dieses (uncodierte) in meinen <script> Block einzufügen.

Wenn gemacht, endet der Skriptblock etwas wie aufzublicken:

<script type="text/javascript"> 
    $(window).on("load", function() { 
     myFunction({"myProperty": "the property value"}); 
    }); 
</script> 

Das heißt, bis zu einem Punkt arbeitet. Wenn mein Modell jedoch eine Zeichenfolgeneigenschaft enthält, deren Text HTML-Tags * enthält, verwirren diese den Browser dahingehend, dass der <script>-Block beendet ist und der Browser beginnt, die im Ansichtsmodell eingebetteten Tags zu rendern.

  • bearbeiten: pro die Kommentare, geschieht dies nur, wenn ein Tag gibt es </script>.

Zum Beispiel:

<script type="text/javascript"> 
    $(window).on("load", function() { 
     myFunction({"myProperty": "<script>...</script>"}); 
    }); 
</script> 

Wie kann ich dieses Problem lösen?

+1

@Jamiec du liegst falsch, browers tun das. Sie suchen nach '' und beenden das Skript. – Halcyon

+0

@Jamiec: Nun, in diesem Fall zeigen sowohl IE11 als auch Chrome das gleiche Verhalten. Es ist erwähnenswert, dass das JSON-Fragment sehr groß ist und der problematische Text ein ganzes HTML-Dokument ist, was sich darauf auswirken kann, ob der Browser sagt "sicherlich muss ein End-Tag oder Zitat fehlen". –

+0

@Halcyon gibt es kein '' Tag in der Zeichenfolge in der Frage - seine 'div' Tags! (daher der Punkt "etwas, was uns nicht sagt") – Jamiec

Antwort

2

Dies ist ein bekanntes Problem. Die json_encode-Funktion von PHP codiert / als \/, um genau dieses Problem zu vermeiden.

Eine einfache Lösung ist, Ihre eigene JSON Encode Wrapper-Funktion zu schreiben, die </script> durch <\/script> nach JSON-Codierung ersetzt.

Vielleicht gibt es eine bessere Lösung, obwohl ich mit asp.net nicht vertraut bin.

Verwandte Themen