Недопустимая дата с BreezeJS и Hottowel

У меня проблема с тем, что ветер вернул DateTime... я также пытался обновить BreezeJs до последней версии, но ничего не изменилось. Я использую breezeJs с HotTowel SPA

Контроллер:

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

Модель:

[Table(name: "Contribuenti")]
public class Contribuente
{
    [Key]
    public int Id { get; set; }

    [MaxLength(30,ErrorMessage = "Il cognome non deve superare i 30 caratteri")]
    public string Cognome { get; set; }

    [MaxLength(35, ErrorMessage = "Il nome non deve superare i 35 caratteri")]
    public string Nome { get; set; }

    [MaxLength(16, ErrorMessage = "Il Codice fiscale non deve superare i 16 caratteri")]
    public string CodiceFiscale { get; set; }

    public virtual ICollection<Residenza> Residenze { get; set; }

}

[Table(name: "Residenze")]
public class Residenza
{
    [Key, Column(Order = 0)]
    public int Id { get; set; }



    public int ContribuenteId { get; set; }
    [ForeignKey("ContribuenteId")]   
    public Contribuente Contribuente { get; set; }


    public DateTime? DataInizio { get; set; }

    public int StradaId { get; set; }
    [ForeignKey("StradaId")]
    public Strada Strada { get; set; }

    public int Civico { get; set; }
    public string Interno { get; set; }
    public string Lettera { get; set; }


}

[Table(name: "Strade")]
public class Strada
{

    [Key]
    public int Id { get; set; }

    [MaxLength(20,ErrorMessage = "Il toponimo deve contenere al massimo 20 caratteri")]
    public string Toponimo { get; set; }

    [MaxLength(50, ErrorMessage = "Il nome deve contenere al massimo 50 caratteri")]
    public string Nome { get; set; }

}

когда я делаю этот запрос:

var query = breeze.EntityQuery.
            from("Contribuenti").expand(["Residenze"], ["Strada"]);

ответ 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}]}]

Но в результате запроса "DataInizio" всегда помечается как "Неверная дата".

Любая идея о проблеме? Спасибо


person Larks81    schedule 07.06.2013    source источник
comment
Я не думаю, что 2012-12-10T22.00.00.000 является допустимой строкой даты JavaScript... как вы сами можете убедиться, попробовав new Date("2012-12-10T22.00.00.000") или Date.parse("2012-12-10T22.00.00.000"). Проблема в этих точках (.). Они должны быть двоеточиями (:). Следующее допустимо: new Date("2012-12-10T22:00:00.000"). Интересно, как вы получили 2012-12-10T22.00.00.000?   -  person Ward    schedule 08.06.2013
comment
Вот спецификация W3C: w3.org/TR/NOTE-datetime   -  person Ward    schedule 08.06.2013
comment
Да, я пробовал также в jsFiddle, и Date(2012-12-10T22.00.00.000) работает хорошо. здесь изображение postimg.org/image/4qpylw829 Но, наконец, я, возможно, нашел проблему. Культура ... я итальянец, и изменение информации о культуре на даты в США работает нормально. это кажется ошибкой ветра.   -  person Larks81    schedule 08.06.2013


Ответы (1)


Серверная сторона Breeze преобразует SQL Server DateTime в ISO 8601. В моем коде (breeze v0.72) даты, кажется, заканчиваются в UTC в SQL и преобразуются обратно в локальные где-то на ветру.

Проверьте документы Breeze по датам. http://www.breezejs.com/documentation/date-time

или, как предлагается в документах breeze, вы можете добавить moment.js в свой проект, если HotTowel этого не делает. https://github.com/moment/moment

Момент распознает JSON, который вы описываете.

Момент() отличается от даты JavaScript, но его легче манипулировать и анализировать. Этот код указывает текущую дату браузера с момента.

var now = window.moment().toDate();

Этот код демонстрирует, как превратить 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 окажется в хранилище метаданных бриза, которое вы используете для заполнения своей модели представления.

Получите страду из хранилища метаданных или базы данных с помощью кода, подобного этому, в вашем dataservice.js. Я немного более многословен, чем необходимо, чтобы вы могли отладить.

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

Вот фрагмент ko viewModel в strada.js

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 для обработчика привязки... Strada DataInizio:...

Я написал этот код на основе моего кода, используя Breeze v0.72, который использует sammy.js в качестве маршрутизатора. Ваш пробег может варьироваться в зависимости от более новых версий breeze и Durandel.

person bizcad    schedule 11.11.2013