如何使jQuery getJSON与Json.NET JavaScriptDateTimeConverter一起工作



ASP.NET的Json序列化程序为DateTime吐出"/Date(1240718400000(/"。在我的Knockout视图模型(使用getJson和Knockout映射器(中,我曾经用一个可写的计算来处理这个问题,该计算会将其转换为实际的javascript日期和日期。

然而,我对这个解决方案不太满意,因为它太扰乱了我的视图模型。

我决定使用Json.NET,它是JavaScriptDateTimeConverter,它给了我日期(1240718400000(。从理论上讲,这很好,因为它可以为我提供真实javascript日期的可观察性。

在实践中,我无法让它发挥作用:(

我知道这是无效的Json,而且jQuery使用的内部Json解析器似乎不接受这一点。

有没有办法让jQuery getJson与Json.NET JavaScriptDateTimeConverter一起工作?

我决定采用这种方法:

我的视图模型在DateTime属性上有JavaScriptDateTimeConverter

[JsonConverter(typeof(JavaScriptDateTimeConverter))]
public DateTime TheEndOfTheWorld { get; set; }

我的控制器返回JsonNetResult

return new JsonNetResult()
{
    Data = new MayaCalendar();
};

最后,我的javascript将其解析为

$.ajax({
    url: "/Calendars/Maya",
    dataType: "text",
}).done(function (data) {
    var json = eval("(" + data + ")");
    var viewmodel = new WeirdCalendarViewModel(json);
    ko.applyBindings(viewmodel);
});

简而言之:

  1. 我使用JavaScriptDateTimeConverter返回一个无效的JSON字符串,该字符串包含新的Date(7919938800000(,而不是"/Date(791993880000(/">

  2. 我用$.ajax调用该方法,dataType为"text",这样jQuery就不会试图解析无效的JSON

  3. 在将对象传递给淘汰视图模型之前,我使用eval((自己进行解析。

  4. 午餐

Pro:

  • 敲除映射器可以使用真正的javascript日期,而不是字符串

Con:

  • eval((

使用此函数将日期从json格式转换为java脚本日期

function renderDate(value) {        
    var getDate;
    if (Date.parse(value)) {
        getDate = new Date(value);
    }
    //used for json date format like /Date(1224043200000)/
    else {
        getDate = new Date(parseInt(value.substr(6)));
    }
    //can decide the format here
    return ((getDate.getMonth() + 1) + "-" + getDate.getDate() + "-" + getDate.getFullYear());
}

您可以在Json.NET中进行序列化,以使用获得相同的日期格式

JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings  {   DateFormatHandling = DateFormatHandling.MicrosoftDateFormat    };
        JsonConvert.SerializeObject(yourDataClass, microsoftDateFormatSettings);

我认为从那开始,作为一小步而不是继续其他的变化。

这是一篇优秀的文章,它提供了一个处理JSON日期的全局解决方案。它只处理ISO和.NET(/DATE(…(/(格式,但也可以很容易地进行修改以处理JavaScriptDateTimeConverter的新DATE(…(格式。

该解决方案通过覆盖jquery的parseJSON方法来实现这一点,同时保持向后兼容性。很酷。

相关内容

  • 没有找到相关文章

最新更新