2011-07-21 24 views
20

¿Cuál sería la forma preferida de inicializar una matriz JS en ASP.NET MVC 3 con Razor con un valor que tengo en mi modelo/modelo de vista?ASP.NET MVC 3 Razor: Inicializar una matriz de JavaScript

Por ejemplo, para inicializar una matriz de cadenas que representan fechas:

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

con

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

Respuesta

30

I no entiendo muy bien la relación entre JS y ASP.NET MVC 3 Razor. Javascript se ejecuta en el lado del cliente sin importar qué tecnología se haya utilizado en el servidor para generar la página. Entonces, en javascript, una matriz es una matriz.

Hay un par de posibilidades para definir las matrices de objetos en javascript

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

o:

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

o todavía:

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

La o final todos los que representan la mismo conjunto. Pero es una matriz de cadenas, no fechas.

Si quería tener una serie de fechas, esto es lo que podría hacer:

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

Ahora la única relación que puedo ver con su pregunta a ASP.NET MVC es que es probable que tenga un poco de variedad en su modelo de vista:

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

que quería serializar y manipular en una matriz javascript. En este caso, aquí está la sintaxis:

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

ahora a causa de los campos manera DateTime se JSON serializado en .NET que va a terminar con lo siguiente en el HTML generado:

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

y si querías para convertir esta matriz de cadenas en una matriz de fechas reales de javascript:

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

Ajustado mi pregunta para tener una mejor descripción del problema, gracias! – Matthieu

+0

+1 - Incluso puede acortar la función de mapa para usar 'new Date (parseInt (date.substr (6)));' ya que 'parseInt' ignorará el final')/'. – TheCloudlessSky

+0

@DarinDimitrov No estamos mezclando C# y JS aquí. Estamos tratando de presentar una declaración a través de la cuchilla C# que el compilador JS puede tomar e inicializar una matriz. – Lakshay

10

lo que pasa es que hacer esto ayer y se acercó con esta solución (si quieres que se vea como el Outpu t que tiene en su pregunta - yo estaba usando esto con 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" no debe ser "@ Html.Raw (String" con according) al final y "@ActiveDates", Model.ActiveDates? ¿O es una diferencia entre la navaja C# Razor y la navaja VB? – Matthieu

+0

En este caso, tienes razón, porque Razor codificará el '' 's lo acabo de escribir, pero gracias por eso. :) – Buildstarted

+0

@ Matthieu: minúsculas s en 'cadena' es válido para C#. No hay nada en su pregunta que dicte VB, por lo que esta respuesta es lo suficientemente válida. No estoy seguro de cómo VB manejará una s minúscula aquí. VB usa S en mayúscula, pero en el pasado nunca ha sido exigente con los tipos de envoltura. No sé cómo es en VB Razor, ya que recientemente comencé a usar MVC/Razor, y solo codifiqué en C# Razor. Como nota al margen, siempre lo harías bien usando mayúsculas en 'Cadena', porque así es como se declara la versión de .NET (independientemente del idioma). – awe

Cuestiones relacionadas