2015-10-16 35 views
2

作为ASP.NET MVC4 Web应用程序的一部分,我有一个带有“保存”功能的客户端Javascript Viewmodel,该功能将POST发送到控制器:MVC控制器将JSON对象日期属性“changed”更改为“Now”

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

“成功”时,客户端需要包含使用KnockoutJS重新映射的原始视图模型的数据。下面的服务器端视图模型是该映射的蓝图:

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

通知的DOB属性与类型的DateTime?。这是在客户端以及所有其他属性上设置的。

从客户端接收视图模型的控制器会创建一个保存到数据库的新“患者”。

 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” 结果包含设置为“现在”的,而不是日期,它从客户端收到时间DOB(日期时间?)属性的原始视图模型。

其他属性与viewmodel最初发送到控制器时保持不变。我已经调试过并且遍历代码。 DOB属性保存在return Json(new {patientViewModel});处发送给它的日期,并且只要它在客户端视图模型中碰到success方法,就立即更改为“Now”。

我错过了什么?

+0

您能否将构造函数显示给PatentViewModel? –

+0

在Save方法的控制器中,出生日期字段是否正确绑定到patientViewModel中?当您将新患者保存到数据库时,问题是否存在? – Chad

+0

目前没有PatientViewModel的构造函数。在访问客户端视图之前创建视图模型对象(PatientViewModel pm = new PatientViewModel();) –

回答

0

感谢所有对我的问题提出意见和建议的人。最后,事实证明,我的viewmodel上的DateTime属性没有被设置为“Now”;当客户端收到它时,它正在重置。

为什么重置?因为用于重新序列化我的viewmodel的Microsoft Json()方法不会返回ISO8601格式的Date对象。这是客户期望的格式,所以它做到了最好的状态(这是重置)。

Stackoverflow后ASP.NET MVC JsonResult Date Format进一步解释了这个问题以及解决方案。

我加JSON.NET我的应用程序(绕过微软的Json方法),并改变了我的控制器的保存方法:

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

           . 
           . 
           . 

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

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

     } 

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

相关问题