我最近开始使用KnockoutJs,并很快意识到使用默认Json(myModelWithADate)结果生成默认的json编码。\/Date(-62135578800000)\/ 经过一些研究,我找到了四种可能的方式来处理dom元素中日期的显示。
Json(myModelWithADate)
\/Date(-62135578800000)\/
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控件处理输入。
处理显示日期或其他类型(例如货币)时,是否存在公认的惯例? 我还有另一个解决这个问题的选择吗?
我个人认为JSON.NET解决方案是最好的,因为它对客户端的影响更少。所有其他解决方案都需要其他客户端解析或其他客户端代码。
我已经将所有使用JSON的ASP .NET代码切换为使用JSON.NET,因为它的可定制性强得多。
例如,我必须在MVC中实现符合Google Chart API(与Knockout结合使用以进行分页等)的JSON数据,默认情况下JavascriptSerializer根本无法做到这一点。
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视图模型。
您可以轻松地扩展类似的方法来处理日期值,但是您更愿意。