2009-09-24 9 views
23

Czy istnieje funkcja użyteczna do usuwania kodu JavaScript w widokach ASP.NET MVC? Często muszę zainicjować mały fragment kodu JavaScript, używając niektórych wartości z widoku; Na przykład może mam coś takiego:Wywiązywanie znaków literowych JavaScript w widokach

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

Spodziewam się coś takiego:

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

Mógłbym, oczywiście, napisać funkcję siebie. Ale ponieważ istnieją już wbudowane narzędzia tworzące kodowanie HTML, a ponieważ jednym z punktów sprzedaży ASP.NET MVC jest to, że <%%> jest domyślnym trybem renderowania, a ponieważ to, co próbuję osiągnąć, jest dość powszechne , zastanawiam się, dlaczego nie mogę znaleźć czegoś takiego już wbudowanego. Czy istnieje na przykład łatwy i elegancki sposób serializowania obiektu do JSON w widokach?

Czy robię coś przeciwko zasadom ASP.NET MVC? Kiedy trafiam na taki problem, zazwyczaj sprawia, że ​​myślę, że albo robię coś złego, ponieważ zakładam, że projektanci spędzili trochę czasu na myśleniu o rzeczywistych scenariuszach.

Odpowiedz

8

Po pewnym czasie pracy w ASP.NET MVC, doszedłem do wniosku, że (najprawdopodobniej) nie ma w tym celu wbudowanego pomocnika. Oczywiście pisanie własnych jest banalne. Tutaj jest to dla zapewnienia kompletności:

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

w widoku, może być wykorzystywane w następujący sposób:

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

W NET 4 Klasa HttpUtility ma wiele statycznych metod kodujących różne konteksty, w tym metodę JavaScriptStringEncode dla tego konkretnego celu.

Często jednak łatwiej jest użyć deserializacji JSON.

7

W MVC 5 przy użyciu szablonów Razor, po to możliwe:

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

W moim przypadku nie potrzebne ciąg obiekt JSON i to jest dla ASP.NET Rdzeń:

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

Unika to znaków "i końca wiersza". Również pozostawia liczby (int) jako liczbę. Może to być przeciążone, aby uwzględnić w razie potrzeby wartości zmiennoprzecinkowe, dziesiętne itd.

Tak, nie mam o tym myśleć, czy cokolwiek innego dla każdego typu:

var serverName = @ToJS(m.ServerName); 
var appSiteUrl = @ToJS(m.SiteUrl); 
var facebookId = @ToJS(m.FacebookAppId); 
Powiązane problemy