2013-06-07 4 views
2

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

Контроллер:

[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» всегда отмечается как «Недействительная дата».

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

+0

Я не думаю, что «2012-12-10T22.00.00.000» является допустимой строкой даты JavaScript ... как вы можете сказать себе, пытаясь «новая дата» («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»? – Ward

+0

Вот спецификация W3C: http://www.w3.org/TR/NOTE-datetime – Ward

+0

Да, я тоже пробовал в jsFiddle и Date ("2012-12-10T22.00.00.000"). здесь изображение http://postimg.org/image/4qpylw829/ Но, в конце концов, я, возможно, нашел проблему. Культура ... я итальянский и меняю информацию о культуре на «en-US», даты отлично работают. это кажется жуком. – Larks81

ответ

1

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

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

или, как предложено в документах о ветре, вы можете добавить moment.js в свой проект, если HotTowel этого не делает. https://github.com/moment/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 закончится в бризе хранилище метаданных, которые вы используете, чтобы заполнить ваш ViewModel.

Извлеките strada из магазина метаданных или базы данных с чем-то вроде этого кода в 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(); 
     }); 
    } 
}; 

Вот фрагмент из ко-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 в качестве маршрутизатора. Ваш пробег может варьироваться в зависимости от новых версий бриза и Durandel.

Смежные вопросы