que tiene una función de JavaScript que llama a un controlador MVC con los datos JSON:forma correcta de convertir JSON Fecha de .NET DateTime Durante Deserialización
var specsAsJson = JSON.stringify(specs);
$.post('/Home/Save', { jsonData: specsAsJson });
En el lado del servidor, dentro del controlador, parece que no puedo para conseguir más allá de este error:
/Date(1347992529530)/ is not a valid value for DateTime.
Esa excepción ocurre cuando llamo Deserialize() (tercera línea en el método a continuación):
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);
}
He estado haciendo un poco de googlear, y el código anterior es mi último intento de hacer que esto funcione (usando TimeSpanJsonConverter de here). Otros enfoques muestran el envío de solo una fecha al servidor, pero tengo una lista de objetos que tienen fechas como algunas propiedades.
¿Existe un enfoque elegante y generalmente aceptado para resolver esto, o todavía necesitamos algún tipo de trabajo desagradable? ¿Cuál es la forma correcta de resolver esto?
Fin de =================== pregunta original ===================
Editar - resuelto por la serialización utilizando JsonConvert
Véase mi respuesta a continuación (no el trabajo en torno a mierda en esta pregunta).
Editar - malísima trabajo en torno
que creó un DTO con los mismos campos exactas como el objeto de dominio, excepto que hice las cadenas campos de fecha para que pudieran deserializar. Ahora que puedo deserializarlo, trabajaré para obtener las fechas en un formato válido para poder crear objetos de dominio desde mis DTO.
public class EquipmentSpecDto
{
public string StartTime { get; set; }
public string EndTime { get; set; }
// more properties here
}
Y yo simplemente utiliza el DTO para la deserialización:
var specs = serializer.Deserialize<List<EquipmentSpecDto>>(jsonData);
Edición 2 - Conversión de JavaScript fechas a .NET
Para completar, y con la esperanza que salve a otra persona por hora, así es como pude convertir las fechas de 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);
}
Parece que está pasando el objeto de fecha como datos de cadena, en lugar del valor real. Necesita convertir la fecha en milisegundos. –
Cuando depuro.WriteLine() mi variable jsonData, parece que ya tiene milisegundos (truncado para facilitar la lectura): '[{" Id ": 1," TrackerJob ": null," Hora de inicio ":"/Fecha (1347993132851)/"," EndTime ":"/Date (1347993132851)/",' –
Lo sentimos, no nos dimos cuenta de que C# tenía un formato específico para importar fechas. Esto puede ayudar: http://stackoverflow.com/questions/9374557/how-to-pass-timespan-value-in-json-format –