0

在看到 Rob Connery 的 Tekpub MVC3 截屏视频后,我正在试验主干 javascript

我喜欢他的海量数据库访问,但是一旦它变得比视频可能向您展示的复杂一点。

我在我的数据库中添加了额外的字段,即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();
}

这使得日期时间从 this:{19/10/2011 1:58:27}变为 this: "19/10/2011"(*values 从运行时的 quickwatch 窗口中获取...,基本上归结为精度损失,它现在是一个基本字符串。

在骨干网将其推回服务器后(在 model.save() 调用上),我尝试像 Rob 一样更新模型:

[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 序列化)?我知道问题本身并不一定是巨大的,它是 json 序列化将它变成了一个丢失数据的字符串,并且没有将它返回到正确的日期。

但是,也许有人有更好的方法来做到这一点......欢迎任何想法......

4

1 回答 1

0

我和你遇到了同样的问题。

您可以更改 ExpandoObjectConverter 中的 Serialize 方法,例如:

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>();
}
于 2011-11-16T09:14:45.017 回答