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

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

1) 创建一个绑定(bind)来处理从 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) 从 Controller 返回“字符串”

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 来处理您的日期,如 stackoverflow answer. 所示

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;
});

它们似乎都有效,但我仍在纠结哪一种感觉“正确”。现在,我的直觉与绑定(bind)和返回字符串混合在一起。我可以看到自己扩展绑定(bind)以使用 jQuery UI 日期选择器控件处理输入。

在处理显示日期或其他类型(例如货币)时,是否有公认的做法?我还缺少其他解决此问题的选项吗?

最佳答案

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

我已经切换到使用 JSON.NET 来处理我所有使用 JSON 的 ASP .NET 代码,因为它是一个更可定制的库。

例如,我必须在 MVC 中实现符合 Google's Chart API 的 JSON 数据。 (与 Knockout 结合用于分页等)和默认的 JavascriptSerializer 根本做不到。

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

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

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

得到:

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

因此,您可以获得一个 Knockout View 模型,而无需跳过任何客户端箍。

你可以很容易地扩展类似的东西来处理你喜欢的日期值。

https://stackoverflow.com/questions/8735617/

相关文章:

php - 为什么在我们有 json_encode 时使用 CJSON 编码

ruby-on-rails - Rails 4 为 API 操作跳过protect_from_for

java - JSONObject.toString : how NOT to escape sla

javascript - 我可以使用空字符串作为对象标识符吗?

json - 通过身份引用对象的标准方式(例如,循环引用)?

java - jackson :反序列化为每个值都具有正确类型的 Map

javascript - Web Workers - JSON 的可传输对象

asp.net - jqgrid 与 asp.net webmethod 和 json 一起使用排序

c# - 无法使用 Json.net 序列化具有复杂键的字典

c# - 将带有数据和文件的 JSON 发布到 Web Api - jQuery/MVC