ASP.NET MVC 3 Razor: инициализация массива JavaScript - PullRequest
20 голосов
/ 21 июля 2011

Каков предпочтительный способ инициализации массива JS в ASP.NET MVC 3 с помощью Razor со значением, которое у меня есть в модели модель / представление?

Например, чтобы инициализировать массив строк, представляющих даты:

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

с

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

Ответы [ 2 ]

31 голосов
/ 21 июля 2011

Я не совсем понимаю связь между JS и ASP.NET MVC 3 Razor. Javascript работает на стороне клиента независимо от того, какая технология была использована на сервере для создания страницы. Таким образом, на JavaScript массив является массивом.

Есть несколько возможностей для определения массивов объектов в javascript

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

или

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

или еще:

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

В конце все они представляют один и тот же массив. Но это массив строк , а не даты .

Если вы хотите иметь массив дат, вот что вы могли бы сделать:

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

Теперь единственное отношение, которое я вижу в вашем вопросе к ASP.NET MVC, - это то, что у вас, вероятно, есть какой-то массив в вашей модели представления:

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

что вы хотели сериализовать и манипулировать в массиве javascript. В этом случае вот синтаксис:

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

Теперь из-за способа сериализации JSON полей DateTime в .NET вы получите следующее в сгенерированном HTML:

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

и если вы хотите преобразовать этот массив строк в массив фактических дат javascript:

var dates = $.map(activeDates, function(date, index) {
    date = date.replace('/Date(', '').replace(')/', '');  
    return new Date(parseInt(date));
});
10 голосов
/ 21 июля 2011

Я просто случайно сделал это вчера и придумал это решение (если вы хотите, чтобы оно выглядело как результат вашего вопроса - я использовал это с jqplot ):

<script type="text/javascript">
    var activeDates = ['@Html.Raw(string.Join("', '", @ActiveDates.Select(f => string.Format("{0:MM-dd-yyyy}", f)).ToArray()))']
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...