【问题标题】:How can I correctly serialize Datetime from an Ajax call inside an IEnumerble list of objects that have a Datetime property如何在具有 Datetime 属性的 IEnumerable 对象列表中正确序列化来自 Ajax 调用的 Datetime
【发布时间】:2019-12-09 06:47:08
【问题描述】:

所以我的视图中有一个对象的 IEnumerable 列表作为我的模型。该对象具有字符串、整数、布尔值和日期时间等字段。我想序列化该列表,但问题是除了日期时间之外的所有内容都正确完成,并且由于某种原因,它序列化为不正确的刻度数,导致当我在控制器中打印它时出现错误的日期。所以我有各种各样的日期,无论是 2019 年 6 月还是 7 月,它们都变成了 01/00/1900。这用于将 DataTable 条目导出到 Excel 工作表中。

我已尝试使用多种方法遍历 IEnumerable 列表,但都无法正确访问 datetime 属性,因此我不能只列出这些日期时间的第二个列表。

$("#btnExport").on("click", function () {
      var modelData = '@Html.Raw(Json.Encode(Model))';
      $.ajax({
            type: "POST",
            url: '@Url.Action("ExportTransactionsInExcel", "Gatelog")',
            contentType: "application/json; charset=utf-8",
            data: modelData,
            success: function (result) {
            },
            error: function (obj) {
               alert("fail");
            }
      });
});

所以有些蜱是... 日期(1561262400000) 日期(1563854400000) 日期(1561867200000) 日期(1564459200000) 我希望能够对列表进行编码并仍然让它返回正确的日期

【问题讨论】:

  • DateTime本身的序列化一般是没有问题的,你确定是设置值吗?分配时如何创建此 DateTime?
  • 所以列表中的对象是一个“交易”。有一个单独的页面创建这些交易,其中一个字段是日期输入字段。有问题的页面用于将这些交易视为表格并能够导出。我知道该值已设置,因为在同一视图页面中我使用模型来显示表格的日期,这是将其导出为同一视图页面中的 excel 表并使用相同模型的 ajax 调用。
  • 您能否调查浏览器中的网络选项卡,看看您是否获得了正确的 DateTimes 值?对于“交易”行?
  • 我编辑了它并添加了我得到的刻度
  • 如果这些是您在 C# 中用于创建日期时间的值 - 这些值不是刻度。刻度看起来像这样:637001922571086046,您所拥有的是 Unix 时间。

标签: javascript c# model-view-controller


【解决方案1】:

所以我认为已经涵盖了javascript Date 使用UTC 纪元1/1/1970 的毫秒数,其中C# 使用01/01/0001 的100 纳秒刻度。有两种可靠的选择来解决这个问题。第一个是创建自己的 JsonConverter 并在那里处理逻辑。

我选择展示的方法有点简单。与其直接反序列化为 DateTime 对象,不如反序列化为 long 变量。然后,我们可以添加一个带有自定义 getter 的 DateTime 变量,该变量将为您处理分配。

public class Model
{
    public long time {get;set;}

    public DateTime datetime 
    {
       get
       {
           return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
              .AddMilliseconds(time)
              .ToLocalTime();
       }
    }   
 }

只需确保传入的图形反序列化为 long 值,然后在您的 C# 代码中仅引用 DateTime 值

【讨论】:

  • 是的,我明白你在说什么,问题是有问题的 DateTime 对象在一个 'Transaction' 类中,该类位于 X 'Transactions' 的 IEnumerable 列表中,我无法操纵它们来导出它。就像这样。我从 View->Controller 中的 User Filter 接收过滤后的数据 -> 不同的视图以显示数据 -> 在同一视图中导出数据 -> 数据作为显示数据的列表出现。我无法在视图中挑出日期时间对象,因为当我在 JS 中时,我需要 c# 来做到这一点。
  • 在 DateTime 对象上使用 JsonIgnore 属性。 Javascript 将非常乐意接收long 值并将其转换回日期。它不知道它来自 C# 模型的类型,它只关心它是一个具有正确属性名称的数值。这个 Transaction 类不是你自己的吗?在这种情况下,我会使用此版本将其复制到另一个模型中,然后将其转换为 Transaction,然后再将其发送回 JS。
【解决方案2】:

我最终只是创建了一个新模型并创建了一个与这些模型字段完全匹配的 JS 对象。然后我将参数传递给新对象并在其上调用 ajax。我从控制器重新运行了查询,这让我仍然可以获得我需要的参数,如果列表变得非常大,它会执行得更快,而不是在前端执行。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2021-08-04
    • 2020-03-16
    • 2014-04-08
    相关资源
    最近更新 更多