0

我在 MVC ASP.NET 项目中使用 jquery 和 bootgrid。

使用 Entity Framework,我得到了我想在网格中显示的数据,在数据库中看起来像这样:

1    Portal    2017-01-16 23:09:54.420    testFirstName testLastName testCompanyName
2    Portal    2017-01-14 14:37:33.750    John    Doe    Walmart

但是,当我将其转换为 Json 并将其传递回 bootgrid 时,JSON 看起来像

{"current":1,"rowCount":2,"rows":
[{"LeadId":1,"ScanDate":"\/Date(-62135571600000)\/","FirstName":"testFirstName","LastName":"testLastName","Company":"testCompanyName"},
{"LeadId":2,"ScanDate":"\/Date(-62135571600000)\/","FirstName":"John","LastName":"Doe","Company":"Walmart"}],"total":2}

ScanDate 值不正确。

在我的 bootgrid 视图中,我将列设置为:

<th data-column-id="ScanDate" data-formatter="date">Date Sent</th>

数据格式化程序如下:

return (date == null ? "" : date.substring(0, 10));

子字符串有效,因为我只看到上述 JSON 响应中数字的前 10 个字符。

为什么日期时间以数字形式出现?

我什至尝试将值转换为 JavaScript 中的日期

var convertDate = 新日期(日期);

但是 convertDate 是未定义的,并且 convertDate.getDay / getHour() 是 NAN。

有任何想法吗?

4

1 回答 1

1

我的设置与您描述的相同 - ASP.NET MVC5、EF6、JsonResult 操作返回 JSON 和来自我的 Bootgrid 的 Ajax 调用。我的 C# 模型中转换为 JSON 的字段之一是 DateTime 类型。

这就是我解决它的方法:

安装 Moment.js 库以在 javascript 中处理日期(我通常也推荐它,而不仅仅是针对这种情况)。

在声明 Bootgrid 的 javascript 中添加转换器:

converters: {
    datetime: {
        from: function (value) { return moment(value); },
        to: function (value) { return moment(FormatJsonDateToJavaScriptDate(value)).format("DD.MM.YYYY"); }
    }
}

添加一个通用功能(我经常重用它)。我是从您的问题下链接的@NineBerry 链接中获得的。

function FormatJsonDateToJavaScriptDate(value) {
    var pattern = /Date\(([^)]+)\)/;
    var results = pattern.exec(value);
    var dt = new Date(parseFloat(results[1]));
    return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

最后在视图本身中装饰此列:

<th data-column-id="SomeDate" data-order="desc" data-converter="datetime">Some header Title</th>

它的作用是将“奇怪”日期解析/转换为可读日期,然后通过 Moment.js 发送并另外解析到我的语言环境中,即 DD.MM.YYYY。

于 2017-03-09T13:40:14.950 回答