我有下一个 JS 代码,我在其中调用 Controller 方法 SaveSettings:
function SaveSettings() {
// get json object from knockoutjs object
var data = ko.toJSON(viewModel);
var params = JSON.stringify(data);
$.ajax({
url: '/MyAjax/SaveSettings/',
type: "POST",
data: JSON.stringify(data),
dataType: "JSON",
contentType: "application/json; charset=UTF-8",
success: function (result) {
alert('ok');
}
});
}
JSON 数据具有以下格式并发送到 Controller :
{
"Name":"xcvxcvxcv",
"GeneralSetting":
{
"Data1":{"IsSync":true,"Value":0},
"Data2":{"IsSync":false,"Value":0},
"PasswordLenght":{"IsSync":false,"Value":7},
"PasswordMessage":{"IsSync":false,"Value":null},
"DiscoverSerialPort":{"IsSync":false,"Value":true}
},
"MailSettings":
{
"IsEnabled":{"IsSync":false,"Value":false},
"ServerAddress":{"IsSync":false,"Value":null},
"PortNumber":{"IsSync":false,"Value":0},
"UserName":{"IsSync":false,"Value":null},
"Password":{"IsSync":false,"Value":null},
"IsSecureNetwork":{"IsSync":false,"Value":false},
"PollFrequency":{"IsSync":false,"Value":0},
"AdminFromEmail":{"IsSync":false,"Value":null},
"AdminEmail":{"IsSync":false,"Value":null},
"ReplyToEmail":{"IsSync":false,"Value":null},
"BCCEmail":{"IsSync":false,"Value":null},
"AuthenticationMethod":{"IsSync":false,"Value":0}
}
}
我的 Controller 方法如下所示:
.....
[HttpPost]
public JsonResult SaveSettings(GlobalData data)
{
return Json(false.ToString(), JsonRequestBehavior.AllowGet);
}
.....
public class GlobalData
{
public string Name { get; set; }
public GeneralSetting GeneralSetting { get; set; }
public MailSetting MailSettings { get; set; }
}
public class MailSetting
{
public SelectedProperty IsEnabled { get; set; }
public SelectedProperty ServerAddress { get; set; }
public SelectedProperty PortNumber { get; set; }
public SelectedProperty UserName { get; set; }
public SelectedProperty Password { get; set; }
public SelectedProperty IsSecureNetwork { get; set; }
public SelectedProperty PollFrequency { get; set; }
public SelectedProperty AdminFromEmail { get; set; }
public SelectedProperty AdminEmail { get; set; }
public SelectedProperty ReplyToEmail { get; set; }
public SelectedProperty BCCEmail { get; set; }
public SelectedProperty AuthenticationMethod { get; set; }
}
public class GeneralSetting
{
public SelectedProperty ScreenTimeout { get; set; }
public SelectedProperty AdminScreenTimeout { get; set; }
public SelectedProperty PasswordLenght { get; set; }
public SelectedProperty PasswordMessage { get; set; }
public SelectedProperty DiscoverSerialPort { get; set; }
}
public class SelectedProperty
{
public bool IsSync { get; set; }
public object Value { get; set; }
}
JSON 对象和我的 GlobalData 类具有相同的结构。(看起来像)
然后方法 SaveSettings 开始工作 GlobalData 变量在 GlobalData 类中定义的所有属性中包含 NULL。 为什么会发生这种情况?我的类结构对于内部 MVC 映射是否不正确?
最佳答案
您对 View 模型进行了两次 JSON 序列化:一次使用 ko 的 toJSON
方法,一次使用 native JSON.stringify
方法。一个就足够了:
function SaveSettings() {
var data = ko.toJSON(viewModel);
$.ajax({
url: '/MyAjax/SaveSettings/',
type: 'POST',
data: data,
contentType: 'application/json; charset=UTF-8',
success: function (result) {
alert('ok');
}
});
}
关于jquery - Asp MVC 3 json复杂对象未初始化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334268/