2009-09-24 21 views
23

Esiste una funzione di utilità per l'escape di JavaScript nelle viste ASP.NET MVC? Ho spesso bisogno di iniziare un piccolo frammento di JavaScript usando alcuni valori dalla vista; per esempio io possa avere qualcosa di simile:Escaping di stringhe di stringhe JavaScript JavaScript nelle viste

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

mi aspetterei qualcosa di simile:

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

ho potuto, ovviamente, scrivere la funzione io. Ma dal momento che esistono già programmi di utilità incorporati per la codifica HTML, e poiché uno dei punti di forza di ASP.NET MVC è che lo <%% è la modalità di rendering predefinita e poiché ciò che sto cercando di ottenere è abbastanza comune , mi chiedo perché non riesca a trovare qualcosa di simile già integrato. Esiste, ad esempio, un modo semplice ed elegante per serializzare un oggetto su JSON nelle viste?

O sto facendo qualcosa contro i principi ASP.NET MVC? Quando mi imbatto in un problema come questo, di solito mi viene in mente che sto facendo qualcosa di sbagliato dal momento che presumo che i progettisti del framework abbiano passato un po 'di tempo a pensare a scenari del mondo reale.

risposta

8

Dopo un po 'di tempo trascorso in ASP.NET MVC, ho concluso che (molto probabilmente) non esiste un helper build-in per questo. Certo, è banale scrivere il tuo. Ecco per ragioni di completezza:

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 una vista, può essere utilizzato come segue:

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

In NET 4, La classe HttpUtility ha una varietà di metodi di codifica statici per vari contesti, incluso un metodo JavaScriptStringEncode per questo particolare scopo.

È spesso più semplice usare solo la deserializzazione JSON.

7

In MVC 5 utilizzando i modelli di rasoio, il seguente è possibile:

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

Nel mio caso avevo bisogno di una stringa non un oggetto JSON e questo è per Asp.Net Nucleo:

@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); 
    } 
} 

Questo sfuggirà ai caratteri 'e alla fine della riga. Inoltre lascia numeri (int) come numero. Questo potrebbe essere sovraccaricato per includere float, decimal e così via, se necessario.

Quindi, non devo pensarci o fare qualcosa di diverso per ogni tipo:

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