【问题标题】:Asp MVC 3 json complex object not initialize propertiesAsp MVC 3 json复杂对象未初始化属性
【发布时间】:2012-01-10 04:19:35
【问题描述】:

我有下一个 JS 代码,我在其中调用控制器方法 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 数据具有下一个格式并发送到控制器:

    {
"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 类具有相同的结构。(看起来他们有)

然后方法 SaveSettings 开始工作 GlobalData 变量在 GlobalData 类中定义的所有属性中包含 NULL。 为什么会这样?我的类结构对于内部 MVC 映射是否不正确?

【问题讨论】:

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


    【解决方案1】:

    您正在 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');
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      与其将其转换为 JSON 字符串,不如将其转换为 this SO question 中的查询字符串?这可能会对你有所帮助。

      【讨论】:

      • 谢谢这是很好的解决方案,但是对于 GET 参数,我应该如何处理 POST 类型参数?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多