Правильная сериализация дат с помощью сериализатора javascript в asp.net mvc3

Я экспериментирую с магистральным javascript после просмотра скриншотов Tekpub MVC3 Роба Коннери

Мне нравится его доступ к базе данных Massive, но как только он станет немного сложнее, чем видео, возможно, покажу вам.

я добавил дополнительные поля в свою базу данных, будучи datetime поля. однако этот сериализатор javascript преобразует их в строки

public string toJson(dynamic content) {
  var serializer = new JavaScriptSerializer();
  serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoObjectConverter() });
  var json = serializer.Serialize(content);
  return json.ToString();
}

это делает datetime из этого: {19/10/2011 1:58:27} в это: "19/10/2011" (* значения, взятые из окна быстрого просмотра во время выполнения..., в основном сводятся к потере точности и теперь являются базовой строкой.

после того, как магистраль отправляет это обратно на сервер (по вызову model.save()), я пытаюсь обновить модель, как это делает Роб:

[HttpPut]
public ActionResult Edit()
{
  var model = SqueezeJson();
  model.UpdatedAt = DateTime.Now;
  _movies.Update(model, model.Id);
  return CmoJSON(model);
}

для функции SqueezeJson, проверьте его источник

приводя к ошибке, как это:

Arithmetic overflow error converting expression to data type datetime.

Я как бы ожидал, что это произойдет, так как я заметил, что даты сбрасываются в строки, я понятия не имел, как они будут возвращаться в дату, используя массив.

кто-нибудь работал с массивами и датами в таком контексте (сериализация в и из json)? я знаю, что проблема сама по себе не обязательно носит массовый характер, это сериализация json, которая превращает ее в строку с потерей данных и не возвращает ее к правильной дате.

но все же, возможно, у кого-то есть лучший способ сделать это... любая идея приветствуется...

1 ответ

Я столкнулся с тем же вопросом с вами.

Вы можете изменить метод Serialize в ExpandoObjectConverter, например:

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
    ExpandoObject expando = (ExpandoObject) obj;

    if(expando!=null)
    {
        Dictionary<string,object> result = new Dictionary<string, object>();
        foreach (KeyValuePair<string, object> item in expando)
        {
            var value = item.Value ?? "";
            if (value is DateTime)
                result.Add(item.Key, ((DateTime) value).ToString("yyyy.MM.dd"));
            else
            {
                result.Add(item.Key, value.ToString());
            }
        }

        return result;
    }

    return new Dictionary<string, object>();
}
Другие вопросы по тегам