jquery - Asp MVC 3 json复杂对象未初始化属性

标签 jquery json asp.net-mvc-3 knockout.js

我有下一个 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/

相关文章:

jquery - 当我选中某个单选按钮时,如何自动设置输入文本

javascript - 使用时出现问题? : operator inside Array. 原型(prototype).findIndex

javascript - 内联样式不适用于动态创建的输入

javascript - 如何从对象数组中获取项目

javascript - 使用 javascript、jquery 或 ajax 通过 php url 动态附加日期

c# - 创建一个即使未列出也始终被授权的角色

asp.net-mvc-3 - 通过 mvc3 导出到 excel

javascript - 如何仅使用 jQuery 构建类似 Quicksand 的动画

c# - 使用 Json.NET 将 Json 字符串发布到远程 PHP 脚本

asp.net-mvc-3 - 我可以在App_Code之外使用全局 Razor @helper吗?