一尘不染

使用Asp.Net MVC和KnockoutJS处理日期

json

我最近开始使用KnockoutJs,并很快意识到使用默认Json(myModelWithADate)结果生成默认的json编码。\/Date(-62135578800000)\/
经过一些研究,我找到了四种可能的方式来处理dom元素中日期的显示。

1)创建一个绑定,以处理从Json日期到所需格式的转换

ko.bindingHandlers.date = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var jsonDate = valueAccessor();
        var value = new Date(parseInt(jsonDate.substr(6)));
        var ret = value.getMonth() + 1 + "/" + value.getDate() + "/" + value.getFullYear();
        element.innerHTML = ret;
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) {

    }
};

用法

<td data-bind="date: DueDate">
</td>

2)从控制器返回“字符串”

return Json(new {MyDate = DateTime.Now.ToShortDateString()});

3)使用JSON.NET指定在
james.newtonking.com上
看到的日期时间格式

string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());
// {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}

4)使用JSON.parse处理日期

JSON.parse(jsonText, function(key, value) {
    // Check for the /Date(x)/ pattern
    var match = /\/Date\((\d+)\)\//.exec(value);
    if (match) {
        var date = new Date(+match[1]); // Convert the ticks to a Date object
        return humanReadable(date); // Format the date how you want it
    }

    // Not a date, so return the original value
    return value;
});

它们似乎都可以工作,但是我仍然在为自己感到“正确”而苦苦挣扎。现在,我的直觉正在与绑定和返回字符串混合使用。如我所见,我扩展了绑定以使用jQuery UI
datepicker控件处理输入。

处理显示日期或其他类型(例如货币)时,是否存在公认的惯例? 我还有另一个解决这个问题的选择吗?


阅读 252

收藏
2020-07-27

共1个答案

一尘不染

我个人认为JSON.NET解决方案是最好的,因为它对客户端的影响更少。所有其他解决方案都需要其他客户端解析或其他客户端代码。

我已经将所有使用JSON的ASP .NET代码切换为使用JSON.NET,因为它的可定制性强得多。

例如,我必须在MVC中实现符合Google Chart
API
(与Knockout结合使用以进行分页等)的JSON数据,默认情况下JavascriptSerializer根本无法做到这一点。

除了JSON.NET,您还可以对其进行自定义,以实际吐出完整的Knockout视图模型,因此您甚至不需要使用映射插件。

我编写了一个名为FluentJson.NET的示例库,该库可让您在Razor中执行以下操作:

var viewModel = @JsonObject.Create()
    .AddProperty("name", "value")
    .AddObservable("knockoutProperty", 123)

得到:

var viewModel = {"name":"value","knockoutProperty":ko.observable(123)}

因此,您可以获得无需任何客户端环就能跳过去的Knockout视图模型。

您可以轻松地扩展类似的方法来处理日期值,但是您更愿意。

2020-07-27