2009-09-24 4 views
23

Gibt es eine Dienstprogrammfunktion zum Entkommen von JavaScript in ASP.NET MVC-Ansichten? Ich muss oft ein kleines JavaScript-Snippet mit einigen Werten aus der Ansicht initiieren; zum Beispiel kann ich so etwas wie:Escaping von JavaScript-Zeichenfolgenliteralen in Ansichten

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Html.JavaScriptEscape(Model.UserName) %>" }); 
page.init(); 
</script> 

Ich könnte natürlich, schreiben die Funktion selbst:

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Model.UserName %>" }); 
page.init(); 
</script> 

würde ich so etwas wie erwartet. Aber da es bereits eingebaute Dienstprogramme gibt HTML-Codierung, und da einer der Verkaufsargumente von ASP.NET MVC ist, dass die <%%> ist der Standard-Rendering-Modus, und seit dem, was ich versuche zu erreichen, ist durchaus üblich Ich frage mich, warum ich so etwas nicht finden kann. Gibt es zum Beispiel eine einfache und elegante Möglichkeit, ein Objekt in Ansichten in JSON zu serialisieren?

Oder mache ich etwas gegen ASP.NET MVC Prinzipien? Wenn ich auf ein Problem wie dieses stoße, denkt es normalerweise, dass ich entweder etwas falsch mache, da ich davon ausgehe, dass die Framework-Designer einige Zeit damit verbracht haben, über reale Szenarien nachzudenken.

Antwort

8

Nach einiger Zeit in ASP.NET MVC, habe ich festgestellt, dass (wahrscheinlich) keine eingebauten Helfer für sie. Natürlich ist es trivial, selbst zu schreiben. Dabei ist es aus Gründen der Vollständigkeit:

using System.Web.Mvc; 
using System.Web.Script.Serialization; 

namespace MyProject.Helpers 
{ 
    public static class JsonExtensions 
    { 
     public static string Json(this HtmlHelper html, object obj) 
     { 
      JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 
      return jsonSerializer.Serialize(obj); 
     } 
    } 
} 

in einer Ansicht kann es verwendet werden, wie folgt:

<script type="text/javascript"> 
var page = new Page(<%= Html.Json(new { currentUser: Model.UserName }) %>); 
page.init(); 
</script> 
47

In .NET 4, The HttpUtility Klasse hat eine Vielzahl von statischen Codierverfahren für verschiedene Kontexte, einschließlich einer JavaScriptStringEncode Methode für diesen bestimmten Zweck.

Es ist jedoch oft einfacher, nur JSON-Deserialisierung zu verwenden.

7

In MVC 5 Razor Vorlagen verwenden, ist Folgendes möglich:

<script type="text/javascript"> 
    var page = new Page({ currentUser: @Html.Raw(Json.Encode(Model.UserName)) }); 
    page.init(); 
</script> 
0

In meinem Fall habe ich einen String benötigt keine JSON-Objekt, und das ist für Asp.Net Kern:

@functions{ 
    public Microsoft.AspNetCore.Html.IHtmlContent ToJS(string value) 
    { 
     return Html.Raw("'" + value.Replace("'", "\\'").Replace("\r", "\\r").Replace("\n", "\\n") + "'"); 
    } 

    public Microsoft.AspNetCore.Html.IHtmlContent ToJS(int value) 
    { 
     return Html.Raw("" + value); 
    } 
} 

Dies wird den Zeichen "und" am Ende der Zeile entgehen. Außerdem hinterlässt es Zahlen (int) als Zahl. Dies könnte bei Bedarf überladen werden, um Float, Dezimal usw. einzuschließen.

Also, ich muss darüber nicht denken oder etwas für jede Art anders machen:

var serverName = @ToJS(m.ServerName); 
var appSiteUrl = @ToJS(m.SiteUrl); 
var facebookId = @ToJS(m.FacebookAppId);