2011-07-21 77 views
20

在我的模型/視圖模型中,使用Razor在ASP.NET MVC 3中初始化一個JS數組的初始化方式是什麼?ASP.NET MVC 3 Razor:初始化一個JavaScript數組

例如初始化表示日期字符串數組:

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

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

回答

30

我不太瞭解JS和ASP.NET MVC 3剃鬚刀之間的關係。無論服務器上使用哪種技術來生成頁面,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> 

,因爲這樣的DateTime字段現在JSON在.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)); 
}); 
+0

調整好自己的問題,有問題的更好的說明,謝謝! – Matthieu

+0

+1 - 你甚至可以縮短map函數使用'new Date(parseInt(date.substr(6)));'因爲'parseInt'會忽略結尾')/'。 – TheCloudlessSky

+0

@DarinDimitrov我們不是在這裏混合使用C#和JS。我們只是試圖通過JS編譯器可以採用的剃鬚刀C#來呈現語句並初始化一個數組。 – Lakshay

10

我只是碰巧這個昨天做的,這種解決方案上來(如果你想讓它看起來像outpu T優有你的問題 - 我是用這個用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」不應該是「@ Html.Raw(String)」和「@ActiveDates」,Model.ActiveDates?或者它是C#Razor和VB剃鬚刀之間的區別? – Matthieu

+0

在這種情況下,你是對的,因爲剃刀會編碼'''我只是把它從袖口寫下來,但是謝謝你。 :) – Buildstarted

+0

@Matthieu:'string'上的小寫字母對C#有效。你的問題中沒有任何東西支配VB,所以這個答案是有效的。我不確定VB如何處理小寫字母s。 VB使用大寫字母S,但過去它從來沒有挑選過類型的套管。我不知道它是如何在VB剃刀,因爲我最近纔開始使用MVC/Razor,只用C#Razor編碼。作爲一個方面說明,你總是在'String'上使用大寫字母,因爲這是它的.NET版本的聲明方式(不管語言如何)。 – awe