我有一个javascript函数,它使用JSON数据调用MVC控制器:
var specsAsJson = JSON.stringify(specs); $.post('/Home/Save', { jsonData: specsAsJson });
在服务器端,在控制器内,我似乎无法克服此错误:
/ Date(1347992529530)/不是DateTime的有效值。
当我调用Deserialize()时会发生该异常(下面方法中的第三行):
public ActionResult Save(string jsonData) { var serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new TimeSpanJsonConverter() }); var specs = serializer.Deserialize<List<EquipmentSpecWithParameterlessConstructor>>(jsonData); return View("Index", _allTrackerJobs); }
我一直在做一些谷歌搜索,上面的代码是我做这项工作的最新尝试(使用此处的TimeSpanJsonConverter )。其他方法显示仅向服务器发送日期,但是我有一些具有日期作为某些属性的对象的列表。
是否有一种优雅的,通常被接受的方法来解决此问题,还是我们仍然需要某种丑陋的解决方法?解决这个问题的正确方法是什么?
===================原始问题的结尾===================
编辑-通过使用JsonConvert进行序列化解决
请参阅下面的 答案 (而不是此问题中的work脚解决方法)。
编辑-糟糕的解决方法
我创建的DTO与域对象具有完全相同的字段,除了我将日期字段设置为字符串以使它们反序列化外。现在,我可以对它进行反序列化,我将努力将日期转换为有效格式,以便可以从DTO创建域对象。
public class EquipmentSpecDto { public string StartTime { get; set; } public string EndTime { get; set; } // more properties here }
我只是使用DTO进行反序列化:
var specs = serializer.Deserialize<List<EquipmentSpecDto>>(jsonData);
编辑2-将JavaScript日期转换为.NET
为了完整起见,并希望我可以节省别人一个小时的时间,这就是我能够转换javascript日期的方式:
foreach (EquipmentSpecDto specDto in specDtos) { // JavaScript uses the unix epoch of 1/1/1970. Note, it's important to call ToLocalTime() // after doing the time conversion, otherwise we'd have to deal with daylight savings hooey. DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); Double startMilliseconds = Convert.ToDouble(specDto.StartTime.Substring(6, 13)); Double endMilliseconds = Convert.ToDouble(specDto.EndTime.Substring(6, 13)); DateTime startTime = unixEpoch.AddMilliseconds(startMilliseconds).ToLocalTime(); DateTime endTime = unixEpoch.AddMilliseconds(endMilliseconds).ToLocalTime(); EquipmentSpec spec = new EquipmentSpec(startTime, endTime, specDto.Equipment); specs.Add(spec); }
我找到了一个简单的答案。在我的JavaScript中,我正在使用JavaScriptSerializer序列化数据。经过大量的搜索之后,我发现本文显示了如何使用JsonConvert进行序列化,该序列会导致使用对.NET更友好的DateTime。
旧:
var specs = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewBag.JobSpecEquipment))
日期看起来像这样: Date(1348017917565)
Date(1348017917565)
新:
var specs = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.JobSpecEquipment));
日期看起来像这样: 2012-09-18T21:27:31.1285861-04:00
2012-09-18T21:27:31.1285861-04:00
所以问题实际上是我最初是如何进行序列化的。一旦我使用了JsonConvert,后端的反序列化就可以了。