правильная сериализация дат с помощью сериализатора javascript в asp.net mvc3 - PullRequest
0 голосов
/ 16 ноября 2011

Я экспериментирую с магистральным 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();
}

это делает дату / время из этого: {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 Ответ

0 голосов
/ 16 ноября 2011

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

Вы можете изменить метод 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>();
}
...