Данные веб-API ASP.NET и данные модели нокаута js не привязываются от клиента к серверу

У меня возникла проблема с публикацией данных из сообщения jquery ajax в метод веб-API asp.net. Свойства даты отображаются в веб-консоли в окружении двух двойных кавычек, затем сбрасываются, а логические свойства устанавливаются равными нулю.

Javascript:

self.startTime = ko.observable(startTime); 
    self.startTimeDate = ko.computed({
        read: function() {
            return moment(self.startTime()).format("MM-DD-YYYY HH:MM:ss");
        },
        write: function(value){
            self.startTime(moment(value).format("MM-DD-YYYY HH:MM:ss"));
        }
    });

    self.endTime = ko.observable(endTime); 
    self.endTimeDate = ko.computed({
        read: function () {
            return moment(self.endTime()).format("MM-DD-YYYY HH:MM:ss");
        },
        write: function (value) {
            self.endTime(moment(value).format("MM-DD-YYYY HH:MM:ss"));
        }
    });



self.includeDeviceAddedToInventory = ko.observable(true); 
var model = {
            auditLogType: ko.toJSON(self.auditLogType),
            id: ko.toJSON(self.auditLogId),
                entriesPerPage: ko.toJSON(self.entriesPerPage), 
                    pageNumber: ko.toJSON(self.pageNumber), 
                startTime: ko.toJSON(self.startTimeDate), 
                    endTime: ko.toJSON(self.endTimeDate), 
                    includeDeviceAddedToInventory: ko.toJSON(self.includeDeviceAddedToInventory) 

...

$.post("api/AuditLog", { filterInfo: model })

Консоль javascript показывает объекты как:

entryPerPage: "0", pageNumber: "0", endTime: ""10-01-2014 06:10:00", startTime: ""10-01-2014 06:10:00"", includeDeviceAddedToInventory: "true "

Однако отладчик .net показывает объекты как: entryPerPage: 0, pageNumber: 0, endTime: {1/1/0001 00:00:00}, startTime: {1/1/0001 00:00:00}, нулевой

ASP.NET

public class PostModel
    {
public int EntriesPerPage { get; set; }
        public int PageNumber { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public string IncludeDeviceAddedToInventory { get; set; }
}

    public HttpResponseMessage Post(PostModel filterInfo)
            {

Я попытался сериализовать с помощью атрибута веб-API newtonsoft, который не сработал. Хотя синтаксис может быть неправильным. Может ли кто-нибудь опубликовать образцы или помочь?

Спасибо.


person test user 53    schedule 01.10.2014    source источник
comment
Вывод вашей консоли javascript показывает удвоенные кавычки вокруг даты. Это действительно так или опечатка?   -  person Mike_G    schedule 01.10.2014
comment
Вот как на самом деле появляется дата.   -  person test user 53    schedule 01.10.2014
comment
тогда это объяснило бы, почему это дата по умолчанию. Я предполагаю, что он думает, что вы передаете пустую строку (и обычно испортите свой список параметров)   -  person Mike_G    schedule 01.10.2014


Ответы (1)


ko.toJSON (и базовый JSON.stringify), примененный к строке, заключит ее в двойные кавычки (они будут частью результата):

ko.toJSON("aaa") = "\"aaa\""

Когда член объекта является результатом ko.toJSON и этот объект также сериализуется в JSON (при отправке на сервер), у вас также будут эти дополнительные кавычки. Решение простое, не сериализуйте свойства отдельно, создайте объект с реальными значениями и отправьте его, он будет сериализован целиком:

var model = {
    auditLogType: self.auditLogType,
    id: self.auditLogId,
    entriesPerPage: self.entriesPerPage, 
    pageNumber: self.pageNumber, 
    startTime: self.startTimeDate, 
    endTime: self.endTimeDate, 
    includeDeviceAddedToInventory: self.includeDeviceAddedToInventory 

...

$.post("api/AuditLog", { filterInfo: model })
person manji    schedule 01.10.2014
comment
Спасибо за ваш вклад. Однако это не работает для меня, я все еще вижу объекты, показанные одинаково. - person test user 53; 01.10.2014
comment
Вы можете увидеть здесь (jsfiddle) результаты сериализации объекта с уже сериализованным свойством и объекта с сырое свойство. - person manji; 02.10.2014
comment
Спасибо за образец, однако он не использует никаких наблюдаемых. Именно поэтому необходимо использовать ko.toJSON в сценарии, с которым я работаю. filterInfo: ko.toJSON(model) и filterInfo: model в моем начальном сообщении отображают те же результаты в .net webapi. - person test user 53; 02.10.2014