2010-10-03 11 views
43

mogę przekazać zmienną z ASP.NET MVC za pomocą tego:Pass Array od MVC do javascript?

var lastCategoryId = '<%=Model.CS.LastSelectedCategory %>'; 

to działać dobrze sznurkiem lub całkowitą, ale jak to zrobić z tablicą ciągów? Próbowałem przekazać tablicę w ten sam sposób, ale zmienna jest ustawiona na System.String []?

Odpowiedz

14

ten powinien zrobić

var someArray=[<%foreach (var s in myStringArray){%>'<%=s%>',<%}%>]; 
+0

musisz pozbyć się ostatniego przecinka – Omu

+1

@Omu: Niekoniecznie. Parsery JavaScript są bardzo wyrozumiałe w tym obszarze. Wszystkie popularne przeglądarki nie mają nic przeciwko ciągłym przecinkom w tablicach. –

+0

fajne, tak jak w C# – Omu

2

Należy sformatować tablicę w składnię tablicy JavaScript.

To otoczy każde wejście pojedynczym cudzysłowem, a następnie połączy je z przecinkami między nawiasami kwadratowymi.

Zaktualizowano: usunięto dodatkowy nawias.

+0

Niestety, ale pojawia się następujący wyjątek z tego rozwiązania =) oczekuje – Banshee

+0

miałem dodatkowy nawias. Usunąłem to. Spróbuj teraz. –

3

coś takiego:

<script type="text/javascript"> 
var myArr = [<%=string.Join(",", strArr.Select(o => "\"" + o + "\"")) %>]; 
</script> 
+0

+1 za to, że jest najczystszy, najbardziej do-punktu. – STW

+0

Problem z tym jest taki, że nie zawija wartości ciągu w cudzysłowach, co spowodowałoby błąd JavaScript. –

+0

@Matthew Manela thanx za poinformowanie mnie o tym, naprawiono: – Omu

43

Mogłeś go JSON serializacji. W ten sposób mogłyby mógł przejść jeszcze bardziej skomplikowane wartości i nie martwić się o ucieczce proste cytaty, cudzysłów, itp:

var categoriesList = <%= new JavaScriptSerializer().Serialize(new[] { "value1", "value2" }) %>; 

pisanie pomocnika HTML w tym celu byłoby jeszcze lepiej:

public static class HtmlExtensions 
{ 
    public static string JsonSerialize(this HtmlHelper htmlHelper, object value) 
    { 
     return new JavaScriptSerializer().Serialize(value); 
    } 
} 

a następnie według ciebie:

<script type="text/javascript"> 
    var categoriesList = <%= Html.JsonSerialize(new[] { "value1", "value2" }) %>; 
</script> 
+6

Muszę przyznać, że jest to o wiele czystsze podejście niż moja odpowiedź. To powinno być głosowane jako rozwiązanie, a nie moje stanowisko. –

+2

@Adrian, wszystko jest subiektywne. Osobiście nie cierpię widzieć C# w widokach. I jestem szczególnie uczulony na pętle w widokach :-) Także kodowanie ciągów, które wyprowadzasz jest niezwykle niebezpieczne i podlega atakom XSS. Właśnie dlatego wolę zawsze polegać na rzeczach wbudowanych w strukturę, więc nie muszę się martwić o prawidłowe ucieczkę, ... –

+1

Za każdym razem, gdy widzę Darina Dymitrowa, odpowiadającego na pytanie, wiem, że będę miał rozwiązanie. Dzięki! –

122

Możesz pozwolić .NET obsłużyć wszystkie ciężkie dźwiganie za pomocą tego prostego wiersza kodu.

Zakłada to, że używasz składni Razor MVC.

var yourJavaScriptArray = @Html.Raw(Json.Encode(Model.YourDotNetArray));

nowsze wersje MVC, przeznaczenie:

var yourJavaScriptArray = @Html.Raw(Json.Serialize(Model.YourDotNetArray));

+4

+1 Wspaniały, bardzo czysty. – twoleggedhorse

+0

daj temu mężczyźnie więcej awantur! – mmcrae

+0

To jest niesamowite! Nie wiedziałem, że to jest obsługiwane w Razorze, więc cholernie dobrze! – Hajjat

0

Po prostu chciał dać odpowiedź za pomocą Razor składnię:

Mamy Dictionary<int, int> że jesteśmy renderingu dla jQuery Sparkline, w postaci "tablicy tablic".

var usageData = [ @string.Join(",", Model.UsageData.Select(d => string.Format("[{0},{1}]", d.Key, d.Value)).ToArray()) ]; 

Który jest używany tak:

$('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips }); 

To co otrzymujemy podczas przeglądania źródło:

var usageData = [ [-13,0],[-12,1],[-11,0],[-10,0],[-9,1],[-8,1],[-7,0],[-6,2],[-5,2],[-4,0],[-3,0],[-2,9],[-1,3],[0,4] ]; 
$('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips }); 
2

One liner:

var data = [@Html.Raw(String.Join(",", Model.MyArray.Select(i => "'" + i + "'")))]; 
2

Tak łatwo, s o proste

<script type="text/javascript"> 
    var array = @Html.Raw(
     Json.Encode(
      (Model).Select(m=> new 
      { 
       id= m.ID, 
       name=m.Name 
      }) 
     ) 
    ); 
</script> 

wyjściowa wynosi:

[{"id":1,"name":"Name of 1"}, {"id":2,"name":"Name of 2"}, ...]; 
1

Korzystanie Json.NET

var yourlist = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(Model.YourList))');