Javascript MVC控制器返回JSON对象日期属性;改为;至;现在";
作为ASP.NET MVC4 Web应用程序的一部分,我有一个客户端Javascript Viewmodel,它带有一个“保存”函数,可以发布到控制器: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
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也许你应该试试浏览器开发者工具中的“网络”选项卡。您可以看到对您的请求的响应。它会告诉你问题是在服务器上还是在客户端。