Asp MVC 3 JSON сложный объект не инициализировать свойства - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть следующий код 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 содержит NULL во всех свойствах, которые определены в классе GlobalData. Почему это происходит? Правильна ли структура моего класса для внутреннего сопоставления MVC?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Вы JSON сериализуете свою модель представления дважды: один раз с помощью метода 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');
        }
    });
}
1 голос
/ 01 декабря 2011

Вместо того, чтобы превращать его в строку JSON, почему бы не превратить его в строку запроса, как в этот вопрос SO ?Это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...