2011-07-21 13 views
20

Jaki byłby preferowany sposób inicjowania tablicy JS w ASP.NET MVC 3 za pomocą Razor z wartością, jaką mam w moim modelu/widoku modelu?Brzytwa ASP.NET MVC 3: Inicjowanie tablicy JavaScript

Na przykład zainicjować tablicę ciągów reprezentujących terminach:

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

z

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

Odpowiedz

30

ja nie bardzo rozumiem związek między JS i ASP.NET MVC 3 Razor. JavaScript działa po stronie klienta, bez względu na to, która technologia została użyta na serwerze do wygenerowania strony. Tak więc w javascript tablica jest tablicą.

Istnieje kilka możliwości, aby zdefiniować tablicę obiektów w JavaScript

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

czyli

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

lub jeszcze:

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

Na th końcu wszyscy ci reprezentują ta sama tablica. Ale jest to ciąg ciągów, a nie dat.

Jeśli chcesz mieć tablicę dat, oto co można zrobić:

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

Teraz tylko relacja widzę z pytaniem do ASP.NET MVC jest to, że prawdopodobnie masz jakąś tablicę na Twój model widoku:

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

, który chcesz przekształcić do postaci szeregowej i zmanipulować w tablicy javascript. W tym przypadku Oto składnia:

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

Teraz ze względu na polach sposób DateTime są JSON odcinkach w .NET skończy się z następujących w wygenerowanym HTML:

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

i jeśli chciałeś przekonwertować tej tablicy ciągów do tablicy rzeczywistych dat javascript:

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

Skorygowany moje pytanie, aby mieć lepszy opis problemu, dzięki! – Matthieu

+0

+1 - Możesz nawet skrócić funkcję mapy, aby użyć 'nowej daty (parseInt (date.substr (6));' ponieważ 'parseInt' zignoruje zakończenie')/'. – TheCloudlessSky

+0

@DarinDimitrov Nie mieszamy tutaj C# i JS. Po prostu próbujemy wyrenderować instrukcję za pomocą C#, którą kompilator JS może pobrać i zainicjować tablicę. – Lakshay

10

ja akurat to zrobić wczoraj i wymyślił tego rozwiązania (jeśli chcesz wyglądać jak outpu t masz w swoim pytaniu - używałem tego z jqplot):

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

"@string" nie powinno być "@ Html.Raw (String" z odpowiednimi) na końcu i "@ActiveDates", Model.ActiveDates? Czy jest to różnica między maszynką do golenia C# i brzytwą VB? – Matthieu

+0

W tym przypadku masz rację, ponieważ Razor zakoduje "", właśnie to napisałem z mankietu, ale dzięki za to. :) – Buildstarted

+0

@Matthieu: Małe litery na 'ciągu' jest poprawne dla C#. Nie ma nic w twoim pytaniu, które dyktuje VB, więc ta odpowiedź jest wystarczająco ważna. Nie jestem pewien, jak VB poradzi sobie z małymi literami. VB używa wielkich liter S, ale w przeszłości nigdy nie było do wyboru typów obudów. Nie wiem, jak to jest w VB Razor, ponieważ dopiero niedawno zacząłem używać MVC/Razor i tylko kodowane w C# Razor. Na marginesie, zawsze będziesz go poprawiał używając wielkich liter w 'String', ponieważ tak deklarowana jest wersja .NET (niezależnie od języka). – awe