2010-10-03 12 views
43

Ich kann eine Variable von MVC ASP.NET passiert dies durch die Verwendung:Array von MVC an Javascript übergeben?

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

Diese Arbeit gut mit String oder Integer, aber wie kann ich tun, mit einer Reihe von Strings? Ich habe versucht, das Array auf die gleiche Weise zu übergeben, aber die Variable ist auf System.String [] eingestellt?

Antwort

14

Dies sollte

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

kennen muss Sie das letzte Komma loswerden – Omu

+1

@Omu: Nicht unbedingt. Javascript-Parser sind in diesem Bereich sehr nachsichtig. Allen gängigen Browsern macht es nichts aus, wenn Kommas in Arrays nachgezogen werden. –

+0

cool, genau wie in C# – Omu

2

Sie müssen das Array in eine JavaScript-Array-Syntax formatieren.

var someArray = [<%= Model.SomeArray.Select(x => "'" + x +"'") 
          .Aggregate((x,y) => x + ", " + y); %>]; 

Dies wird jeden Eintrag durch einfache Anführungszeichen umgeben und sie dann mit Kommas zwischen eckigen Klammern verbinden.

Aktualisiert: Zusätzliche Klammern entfernt.

+0

Sorry, aber ich bekomme die folgende Ausnahme bei dieser Lösung =) erwartet – Banshee

+0

Ich hatte eine zusätzliche Klammer. Ich habe es entfernt. Versuche es jetzt. –

3

etwas wie folgt aus:

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

+1 für die sauberste, die meisten zu dem Punkt – STW

+0

Das Problem mit diesem ist, dass es nicht die Zeichenfolge Werte in Anführungszeichen, die einen JavaScript-Fehler verursachen würde. –

+0

@Matthew Manela Danke, dass du mir das erzählst, hast es repariert – Omu

43

Sie JSON es serialisiert werden könnte. Auf diese Weise könnte könnte noch komplexer Werte übergeben und sich keine Sorgen über zu entkommen einfache Anführungszeichen, doppelte Anführungszeichen, etc:

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

ein HTML-Helfer schreiben, dies zu tun wäre noch besser:

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

und dann Ihrer Meinung nach:

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

Ich muss zugeben, es ist ein viel sauberer Ansatz als meine Antwort. Dies sollte als Lösung gewählt werden, nicht meine Post. –

+2

@Adrian, alles ist subjektiv. Persönlich hasse ich C# in Ansichten. Und ich bin besonders allergisch auf Schleifen in Ansichten :-) Auch die Codierung der Strings, die Sie ausgeben, ist extrem gefährlich und unterliegt XSS-Attacken. Deshalb ziehe ich es vor, mich immer auf Dinge zu verlassen, die in den Rahmen eingebaut sind, damit ich mir keine Sorgen machen muss ... –

+1

Immer wenn ich Darin Dimitrov auf eine Frage antworte, weiß ich, dass ich eine Lösung haben werde. Vielen Dank! –

122

Sie könnten .NET mit dieser einfachen Codezeile das ganze schwere Heben für Sie behandeln lassen.

Dies setzt voraus, dass Sie die MVC Razor-Syntax verwenden.

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

Für neuere Versionen von MVC, zu verwenden:

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

+4

+1 Brilliant, sehr sauber. – twoleggedhorse

+0

geben Sie diesem Mann mehr upvotes! – mmcrae

+0

Das ist so erstaunlich! Wusste nicht, dass das in Razor unterstützt wurde, also verdammt gut! – Hajjat

0

Ich wollte nur eine Antwort mit Razor-Syntax zur Verfügung zu stellen:

Wir haben eine Dictionary<int, int> haben, dass wir Rendering für eine jQuery Sparkline, in Form von "einem Array von Arrays".

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

, die wie so verwendet wird:

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

Dies ist, was wir bekommen, wenn die Quelle sehen:

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

Motto:

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

So einfach, s o einfache

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

Ausgang ist:

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

Mit Json.NET

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