У меня есть функция javascript, которая вызывает MVC-контроллер с данными JSON:
var specsAsJson = JSON.stringify(specs);
$.post('/Home/Save', { jsonData: specsAsJson });
На стороне сервера, внутри контроллера, я не могу пропустить эту ошибку:
/Дата (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
См. ниже мой ответ
Изменить - Crappy work-around
Я создал 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 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);
}