2011-11-30 64 views
2

我有下一个JS代码,我呼叫控制器方法SaveSettings:天冬氨酸MVC 3 JSON复杂的对象不初始化属性

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映射的类结构是否不正确?

回答

3

你是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'); 
     } 
    }); 
} 
+0

是的,你是绝对正确的。谢谢。 –

1

而不是把它变成一个JSON字符串,为什么不把它变成查询字符串,如this SO question?这可能会帮助你。

+0

感谢这是一个很好的解决方案,但对于GET参数,我应该如何处理POST类型参数? –

+0

和我的jsonobject在你的情况下是非常大的我得到异常:该请求的查询字符串的长度超过了配置的maxQueryStringLength值。 –