ASP.NET MVC 3 Razor: initialiser un tableau JavaScript

Quelle serait la manière privilégiée d'initialiser un tableau JS dans ASP.NET MVC 3 avec Razor avec une valeur que j'ai dans mon modèle / modèle de vue?

Par exemple pour initialiser un ensemble de chaînes représentant les dates:

<script type="text/javascript"> var activeDates = ["7-21-2011", "7-22-2011"]; </script> 

avec

 public class MyViewModel { public DateTime[] ActiveDates { get; set; } } 

Je ne comprends pas très bien la relation entre JS et ASP.NET MVC 3 Razor. Javascript s'exécute sur le côté du client peu importe la technologie utilisée sur le serveur pour générer la page. Ainsi, sur javascript, un tableau est un tableau.

Il existe quelques possibilités de définir des tableaux d'objets en javascript

 var activeDates = [ '7-21-2011', '7-22-2011' ]; 

ou:

 var activeDates = new Array(); activeArrays.push('7-21-2011'); activeArrays.push('7-22-2011'); 

Ou encore:

 var activeDates = new Array(); activeArrays[0] = '7-21-2011'; activeArrays[1] = '7-22-2011'; 

À la fin, tous ceux qui représentent le même tableau. Mais c'est un ensemble de chaînes , pas de dates .

Si vous vouliez avoir un éventail de dates, voici ce que vous pourriez faire:

 var activeDates = [ new Date(2011, 6, 21, 0, 0, 0, 0), new Date(2011, 6, 22, 0, 0, 0, 0) ]; 

Maintenant, la seule relation que je peux voir avec votre question à ASP.NET MVC est que vous avez probablement un tableau sur votre modèle de vue:

 public class MyViewModel { public DateTime[] ActiveDates { get; set; } } 

Que vous vouliez sérialiser et manipuler dans un réseau javascript. Dans ce cas, voici la syntaxe:

 @model MyViewModel <script type="text/javascript"> var activeDates = @Html.Raw(Json.Encode(Model.ActiveDates)); </script> 

Maintenant, en raison de la façon dont les champs DateTime sont JSON sérialisés dans .NET, vous finirez par ce qui suit dans le HTML généré:

 var activeDates = ["\/Date(1309471200000)\/","\/Date(1311199200000)\/"]; 

Et si vous vouliez convertir cette gamme de chaînes en une série de dates de javascript:

 var dates = $.map(activeDates, function(date, index) { date = date.replace('/Date(', '').replace(')/', ''); return new Date(parseInt(date)); }); 

Je viens de faire cela hier et je suis venu avec cette solution (si vous voulez qu'il ressemble à la sortie que vous avez dans votre question – j'utilisais cela avec jqplot ):

 <script type="text/javascript"> var activeDates = ['@Html.Raw(string.Join("', '", @ActiveDates.Select(f => string.Format("{0:MM-dd-yyyy}", f)).ToArray()))'] </script>