Javascript MVC控制器返回JSON对象日期属性;改为;至;现在";

Javascript MVC控制器返回JSON对象日期属性;改为;至;现在";,javascript,c#,asp.net-mvc,asp.net-mvc-4,knockout.js,Javascript,C#,Asp.net Mvc,Asp.net Mvc 4,Knockout.js,作为ASP.NET MVC4 Web应用程序的一部分,我有一个客户端Javascript Viewmodel,它带有一个“保存”函数,可以发布到控制器: PatientViewModel = function (data) { var self = this; ko.mapping.fromJS(data, {}, self); self.save = function () { $.ajax({ url: "/Patient/S

作为ASP.NET MVC4 Web应用程序的一部分,我有一个客户端Javascript Viewmodel,它带有一个“保存”函数,可以发布到控制器:

PatientViewModel = function (data) {
    var self = this;
    ko.mapping.fromJS(data, {}, self);

    self.save = function () {
        $.ajax({
            url: "/Patient/Save/",
            type: "POST",
            data: ko.toJSON(self),
            contentType: "application/json",
            success: function (data) {
                if (data.patientViewModel != null) {                 
                    ko.mapping.fromJS(data.patientViewModel, {}, self);
                }
            }
        });
    }
}
public ContentResult Save(PatientViewModel patientViewModel)
        {
            Patient patient = new Patient();

                              .
                              .
                              .

            string patVM = JsonConvert.SerializeObject(new { patientViewModel });

            return new ContentResult { Content = patVM, ContentType = "application/json" };

        }
“成功”后,客户机希望数据包含使用KnockoutJS重新映射的原始viewmodel。以下服务器端视图模型是映射的蓝图:

public class PatientViewModel
    {
        public int PatientId { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public DateTime? DOB { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
        public string Phone { get; set; }
        public string PhoneAlternate { get; set; }
    }
请注意类型为
DateTime?
的DOB属性。这与所有其他属性一起在客户端上设置

从客户端接收viewmodel的控制器将创建一个新的“患者”,并保存到数据库中

        public JsonResult Save(PatientViewModel patientViewModel)
        {
            Patient patient = new Patient();

            patient.LastName = patientViewModel.LastName;
            patient.FirstName = patientViewModel.FirstName;
            patient.DOB = patientViewModel.DOB;
            patient.Address = patientViewModel.Address;
            patient.City = patientViewModel.City;
            patient.State = patientViewModel.State;
            patient.Zip = patientViewModel.Zip;
            patient.Phone = patientViewModel.Phone;
            patient.PhoneAlternate = patientViewModel.PhoneAlternate;

            _patientContext.Patients.Add(patient);
            _patientContext.SaveChanges();

            return Json(new { patientViewModel });
        }
当控制器返回其“JsonResult”时,结果包含原始viewmodel,其DOB(DateTime?)属性设置为“Now”,而不是从客户端接收的日期和时间

其他属性与viewmodel最初发送到控制器时保持相同。我已经调试并逐步完成了代码。DOB属性保存在
返回Json(new{patientViewModel})点发送给它的日期
,并在点击客户端viewmodel中的
success
方法后立即更改为“Now”


我遗漏了什么?

感谢所有对我的问题提出意见和建议的人

最后,我的viewmodel上的DateTime属性没有设置为“Now”;当客户端收到它时,它正在被重置

为什么要重置它?因为我用来重新序列化viewmodel的Microsoft Json()方法不会返回ISO8601格式的日期对象。这是客户端所期望的格式,因此它尽了最大努力(这是一次重置)

Stackoverflow post对此问题作了进一步解释,并给出了解决方案

我向我的应用程序中添加了(绕过Microsoft的Json方法)并更改了控制器的保存方法:

PatientViewModel = function (data) {
    var self = this;
    ko.mapping.fromJS(data, {}, self);

    self.save = function () {
        $.ajax({
            url: "/Patient/Save/",
            type: "POST",
            data: ko.toJSON(self),
            contentType: "application/json",
            success: function (data) {
                if (data.patientViewModel != null) {                 
                    ko.mapping.fromJS(data.patientViewModel, {}, self);
                }
            }
        });
    }
}
public ContentResult Save(PatientViewModel patientViewModel)
        {
            Patient patient = new Patient();

                              .
                              .
                              .

            string patVM = JsonConvert.SerializeObject(new { patientViewModel });

            return new ContentResult { Content = patVM, ContentType = "application/json" };

        }

现在,日期将填充相应的属性。再一次,谢谢

您可以向PatentViewModel显示构造函数吗?在控制器的Save方法中,出生日期字段是否正确绑定回patientViewModel?是否在将新患者保存到数据库时出现问题?目前没有PatientViewModel的构造函数。viewmodel对象是在访问客户端视图之前创建的(PatientViewModel pm=new PatientViewModel();)!为什么要传递从客户端收到的相同模型(ajax)。您在客户端vm中拥有所有更新的数据以供进一步使用,无需在success
ko.mapping.fromJS(data.patientViewModel,{},self)下再次执行此操作。请帮助我了解是否有问题case@BlueMentat也许你应该试试浏览器开发者工具中的“网络”选项卡。您可以看到对您的请求的响应。它会告诉你问题是在服务器上还是在客户端。