Entity framework BreezeJS和HotTower的日期无效

Entity framework BreezeJS和HotTower的日期无效,entity-framework,breeze,durandal,hottowel,Entity Framework,Breeze,Durandal,Hottowel,我对breeze返回日期时间有问题。。。我也尝试将BreezeJs更新到最新版本,但没有任何变化。我用breezeJs和热毛巾水疗 控制器: [BreezeController] public class ContribuentiController : ApiController { readonly EFContextProvider<LarksTribContext> _contextProvider = new EFContextProvider<Lar

我对breeze返回日期时间有问题。。。我也尝试将BreezeJs更新到最新版本,但没有任何变化。我用breezeJs和热毛巾水疗

控制器:

[BreezeController]
public class ContribuentiController : ApiController
{
    readonly EFContextProvider<LarksTribContext> _contextProvider =
    new EFContextProvider<LarksTribContext>();

    [System.Web.Http.HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }


    // ~/api/todos/Todos
    // ~/api/todos/Todos?$filter=IsArchived eq false&$orderby=CreatedAt 
    [System.Web.Http.HttpGet]
    public IQueryable<Contribuente> Contribuenti()
    {
        if (_contextProvider.Context.Contribuente != null)
        {
            return _contextProvider.Context.Contribuente.Include("Residenze.Strada");//.Include("Residenze").Include("Residenze.Strada");
        }
        else
        {
            return null;
        }
    }


    [System.Web.Http.HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }
}
json响应是:

[{"$id":"1","$type":"LarksTribUnico.Models.Contribuente, LarksTribUnico","Id":1,"Cognome":"Manuele","Nome":"Pagliarani","CodiceFiscale":"HSDJSHDKHSD","Residenze":[{"$id":"2","$type":"LarksTribUnico.Models.Residenza, LarksTribUnico","Id":5,"ContribuenteId":1,"Contribuente":{"$ref":"1"},"DataInizio":"2012-12-10T22.00.00.000","StradaId":4,"Strada":{"$id":"3","$type":"LarksTribUnico.Models.Strada, LarksTribUnico","Id":4,"Toponimo":"Via","Nome":"Milano"},"Civico":0}]}]
但在查询结果中,“数据化”总是标记为“无效日期”

有没有办法解决这个问题?
谢谢,Breeze服务器端将SQL server日期时间转换为ISO 8601。在我的代码(breeze v0.72)中,日期似乎以SQL中的UTC结束,并在breeze中的某个地方转换回本地

在日期上检查Breeze文档

或者,正如breeze文档中所建议的,如果Hottown没有添加,您可以将moment.js添加到项目中

矩识别您正在描述的JSON

矩()与JavaScript日期不同,但更易于操作和解析。 此代码将显示当前浏览器的起始日期

var now = window.moment().toDate();
这段代码演示了如何通过moment将ISO转换为JavaScript日期对象

// ISO 8601 datetime returned in JSON.  
// In your code, you would pull it out of your the 
// return variable in your dataservice.js
var DataInizio = "2012-12-10T22.00.00.000" 

// convert your variable to a moment so you can parse it 
var momentdatainizio = window.moment(DataInizio); 

// convert the ISO to a javascript Date object so you can use it in js.
var mydate = window.moment(DataInizio).toDate();  
您的Stada最终将位于breeze元数据存储中,您可以使用该存储来填充viewModel

在dataservice.js中使用类似于以下代码的代码从元数据存储或数据库检索strada。我是一个比必要的更详细一点,所以你可以调试

var getStrada  = function (stradaId, callback) {
    var query = EntityQuery.from("Strada")
        .using(manager);
    var pred = new breeze.Predicate("idd", "eq", stradaId);
    // create the query
    var queryb = query.where(pred);

    // check the MetadataStore to see if you already have it
    var localsession = queryb.executeLocally();
    if (localsession) {
        if (localsession.length > {          
           window.app.vm.strada.strada(data.results);
           return localsession;
        }
    }
    // get it from the server
    else {
        // return the promise to prevent blocking
        //  then set your viewModel when the query fulfills
        //  then make your callback if there is one
        //  handle the fail in your queryFailed function if there is a problem
        return manager.executeQuery(queryb)            
        .then(function (data) {
            window.app.vm.strada.strada(data.results);
        })
        .then(function () {
            if ((typeof callback !== 'undefined' && callback !== null)) {
                callback();
            }
        })
        .fail(function () {
            queryFailed();
        });
    }
};
下面是strada.js中ko viewModel的一个片段

app.vm.strada = (function ($, ko, dataservice, router) {
    var strada = ko.observable();
    ...
    return {
         strada : strada,
         ...
 })($, ko, app.dataservice, app.router);
下面是ko.bindingHandlers.js中用于敲除的自定义绑定处理程序。这段代码有点冗长,因此您可以调试中间变量

window.ko.bindingHandlers.DataInizio = {
  // viewModel is a Strada
  update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    var value = valueAccessor(), allBindings = allBindingsAccessor();
    var valueUnwrapped = window.ko.utils.unwrapObservable(value);
    var $el = $(element);
    if (valueUnwrapped.toString().indexOf('Jan 1') >= 0)
        $el.text("Strada not Started");
    else {
        var date = new Date(valueUnwrapped);
        var d = moment(date);
        $el.text(d.format('MM/DD/YYYY'));
    }
  }
};
下面是绑定处理程序的html ... 斯特拉达数据化: ...


我使用Breeze v0.72编写了这段代码,它使用sammy.js作为路由器。您的里程数可能会因breeze和Durandel的更新版本而异。

我认为“2012-12-10T22.00.00.000”不是有效的JavaScript日期字符串。。。您可以通过尝试
新日期(“2012-12-10T22.00.00.000”)
日期解析(“2012-12-10T22.00.00.000”)
告诉自己。问题是那些点(.)。它们应该是冒号(:)。以下内容可以:
新日期(“2012-12-10T22:00:00.000”)
。我想知道你是如何得到“2012-12-10T22.00.00.000”的?这是W3C规范:是的,我也尝试过JSFIDLE和Date(“2012-12-10T22.00.00.000”)工作得很好。这是一张图片,但最后我可能发现了问题所在。文化。。。我是意大利人,将文化信息更改为“en-US”日期很好。这似乎是一阵微风。
app.vm.strada = (function ($, ko, dataservice, router) {
    var strada = ko.observable();
    ...
    return {
         strada : strada,
         ...
 })($, ko, app.dataservice, app.router);
window.ko.bindingHandlers.DataInizio = {
  // viewModel is a Strada
  update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    var value = valueAccessor(), allBindings = allBindingsAccessor();
    var valueUnwrapped = window.ko.utils.unwrapObservable(value);
    var $el = $(element);
    if (valueUnwrapped.toString().indexOf('Jan 1') >= 0)
        $el.text("Strada not Started");
    else {
        var date = new Date(valueUnwrapped);
        var d = moment(date);
        $el.text(d.format('MM/DD/YYYY'));
    }
  }
};