asp.net MVC 3 json复杂对象不初始化属性



我有下一个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字符串,为什么不把它变成一个查询字符串,就像在这个问题?这可能对你有帮助。

最新更新