如果模型包含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()
,我仍然得到一個字符串,而不是日期類型。
您可以通過添加$ type成員來添加類型,並且可以通過$ id和$ ref成員保留引用和循環引用。通過使用自定義'replacer'回調來處理字符串化:'JSON.stringify(value [,replacer [,space]])'),您可以正確嵌入這些成員。然後,只要服務器端存在這些類型,JSON.NET就可以用強類型來解釋和恢復對象。您可以實現自己的類型映射方案(我已經完成了中間類型,模板類型,命名空間鏡像等),並構建到JSON.NET中。由於強類型,在AS3中更容易,與JavaScript不同。 – Triynko
要嵌入引用,可以在遇到它時將對象添加到散列。你總是檢查哈希以查看對象是否已經被序列化,如果有,那麼你從哈希中獲取ID並在字符串中嵌入一個'{$ ref:id}'。同樣,這在Flash/AS3中更容易,因爲它實際上支持在Dictionary類中作爲鍵的對象引用,而JavaScript不支持。 JavaScript將所有的鍵轉換爲字符串,這對於對象來說是無用的。直到標準追上AS3的唯一解決方法是重寫object.prototype,以便爲每個對象提供一個唯一的字符串ID。 – Triynko