保存toISODate会反序列化为非iso字符串

时间:2013-11-21 22:31:21

标签: json.net breeze asp.net-web-api

我遵循通常的建议,即使用toISODate js函数序列化要发送到服务器的javascript Date对象。

事实上Breeze.js正在为我做这件事,这很棒。当我的实体上的属性是DateTime时,一切都按预期工作 - 日期以UTC(0偏移日期)日期时间的形式保存到数据库。

当实体上的属性属于字符串时,我遇到了问题。通过网络发送的日期“ 2013-06-08T23:00:00Z ”将被反序列化为实体上的字符串属性为 06 / 08/2013 23:00:00 ',这与保存到数据库中varchar支持列的值相同。

因此,日期被反序列化为' en-US '格式化日期(MM / dd / yyyy HH:mm:ss)。我不知道为什么会发生这种情况或者如何更改内容以便字符串保持完整,因为它被反序列化为 string 属性。

一些技术说明:

  • 我通过将BeforeSaveEntitiesDelegate连接到EFContextProvider并在保存之前检查调试器中的Entity实例来确认属性中的反序列化值
  • 在服务器上的BeforeSaveEntitiesDelegate方法中检查实体时,我注意到Thread.CurrentThread.CurrentCulture和CurrentUICulture都是'en-GB'
  • 由于技术原因,我需要使用字符串属性而不是DateTime(或DateTimeOffset) - 基本上该属性可以接收任何类型的数据,因此字符串是适合所有内容的通用格式。

非常欢迎帮助!

由于 Christian Crowhurst

1 个答案:

答案 0 :(得分:0)

对于.NET服务器,Breeze使用JSON.net来序列化/反序列化json。 Breeze允许您通过自动检测'BreezeConfig'类的任何“自定义”实现来配置它。

这意味着您可以通过实现BreezeConfig的子类来自定义Breeze对JSON.Net的序列化行为的使用。这可能在您的服务器项目中看起来像这样。

using Breeze.ContextProvider;
using Breeze.WebApi2;
using Newtonsoft.Json;

namespace Sample_WebApi2 {

  public class CustomBreezeConfig : BreezeConfig {

  /// <summary>
  /// Override to use a specialized JsonSerializer implementation.
  /// </summary>
  protected override JsonSerializerSettings CreateJsonSerializerSettings() {
    // get the breeze default settings.
    var baseSettings = base.CreateJsonSerializerSettings();
    // Not sure if this is the setting you want but...
    baseSettings.DateParseHandling = DateParseHandling.None;
    return baseSettings;
  }
}