2013-06-26 53 views
9

如果模型包含DateTime屬性,則由ASP.NET MVC的System.Web.Helpers.Json.Encode()生成的JavaScript存在問題。ASP.NET MVC Json.Encode()日期時間編碼問題字符串不是日期類型

我的模型:

public class MyViewModel 
{ 
    public string MyString { get; set; } 
    public DateTime MyDateTime { get; set; } 
    public int MyInt { get; set; } 
    public string[] MyStringArray { get; set; } 
} 

我的控制器:

public ActionResult Index() 
{ 
    var myViewModel = new MyViewModel(); 
    myViewModel.MyString = "My test string"; 
    myViewModel.MyInt = 100; 
    myViewModel.MyDateTime = DateTime.Now; 
    myViewModel.MyStringArray = new string[] { "string 1", "string 2" }; 

    return View(myViewModel); 
} 

筆者認爲:

<script type="text/javascript"> 

    var myViewModel = @Html.Raw(Json.Encode(Model)) ; 

</script> 

輸出:

<script type="text/javascript"> 

    var myViewModel = {"MyString":"My test string","MyDateTime":"\/Date(1372280916431)\/","MyInt":100,"MyStringArray":["string 1","string 2"]} ; 

</script> 

問題在於日期編碼的方式。它是一個字符串,而不是日期類型。

我也試過使用Newtonsoft.Json.JsonConvert.SerializeObject(),我仍然得到一個字符串,而不是日期類型。

回答

2

此行爲是設計使然。

JSON(不像Javascript)不是日期類型。

+0

您可以通過添加$ type成員來添加類型,並且可以通過$ id和$ ref成員保留引用和循環引用。通過使用自定義'replacer'回調來處理字符串化:'JSON.stringify(value [,replacer [,space]])'),您可以正確嵌入這些成員。然後,只要服務器端存在這些類型,JSON.NET就可以用強類型來解釋和恢復對象。您可以實現自己的類型映射方案(我已經完成了中間類型,模板類型,命名空間鏡像等),並構建到JSON.NET中。由於強類型,在AS3中更容易,與JavaScript不同。 – Triynko

+0

要嵌入引用,可以在遇到它時將對象添加到散列。你總是檢查哈希以查看對象是否已經被序列化,如果有,那麼你從哈希中獲取ID並在字符串中嵌入一個'{$ ref:id}'。同樣,這在Flash/AS3中更容易,因爲它實際上支持在Dictionary類中作爲鍵的對象引用,而JavaScript不支持。 JavaScript將所有的鍵轉換爲字符串,這對於對象來說是無用的。直到標準追上AS3的唯一解決方法是重寫object.prototype,以便爲每個對象提供一個唯一的字符串ID。 – Triynko

8

Date類型在JavaScript中沒有文字。你將不得不調用它的構造函數。

var myDate = new Date(@Html.Raw(Json.Encode(Model.MyDateTime))); 
2

您可以使用

var myDate = new Date(parseInt('@Html.Raw(Json.Encode(Model.MyDateTime))'.substr(6))); 

var myDate = new Date(parseInt('@Html.Raw(Json.Encode(Model.MyDateTime))'.replace('/Date(', ''))); 

兩個忽略 '/日期(' 一部分,並與 「parseInt函數」 你忽略了最後一個 ')/' 的一部分。然後從毫秒獲取日期對象。

但不要忘記,當您創建Date()對象時,它會根據瀏覽器的GMT時間創建。

當使用這個日期()對象在我的javascript代碼,我總是使用UTC日期的方法,如:myDate.getUTCHours();

0

使用Forloop.HtmlHelpers NuGet包就可以得到AddScriptBlock的HtmlHelper擴展,這樣做與Newtonsoft來電設定變數的腳本:

@{ 
using (var context = Html.BeginScriptContext()) 
{ 
    Html.AddScriptBlock(@" 
$(function() { 
     var data = " + JsonConvert.SerializeObject(Model.Data) + @"; 
     ///continue processing ... 
});"); 
} 

}

2

從這些答案中汲取靈感,我需要我可空日期傳遞到MVC控制器,並且已是必然模型correctl年。這是我登陸的地方:

var dob = @Html.Raw(Json.Encode(Model.BirthDate.HasValue ? Model.BirthDate.Value.ToShortDateString() : null)); 
相關問題