我有下一个JS代码,我调用控制器方法savessettings:
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数据有下一个格式和发送到控制器:
{
"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}
}
}
我的控制器方法如下:
.....
[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类具有相同的结构。(看起来他们有)
但是方法savessettings开始工作GlobalData变量在GlobalData类中定义的所有属性中包含NULL。为什么会发生这种情况?是我的类结构不正确的内部MVC映射?
你是JSON序列化你的视图模型两次:一次与ko的toJSON
方法,一次与本地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');
}
});
}
而不是把它变成一个JSON字符串,为什么不把它变成一个查询字符串,就像在这个问题?这可能对你有帮助。