将JSON反序列化为控制器中的嵌套视图模型

时间:2013-01-29 20:15:29

标签: asp.net-mvc json viewmodel

我有一个嵌套的视图模型结构:

public class PersonViewModel
{
    public int Height { get; set; }
    public List<LegViewModel> Legs {get;set;}
}

public class LegViewModel
{
    public int Length { get; set; }
}

我使用jquery post发送了一些JSON:

<script>
    $(function () {

        $("#mybutton").click(function () {
            $.ajax({
                type: "POST",
                data: {
                    Height: 23,
                    Legs: [
                        {
                            Length: 45,
                        }
                    ]
                }
            });
        });
    });
</script>
<button id="mybutton">hello world!</button>

我发布到此控制器操作:

[HttpPost]
public ActionResult Save(PersonViewModel model)
{
    return Json(new { success = true });
}

Height的{​​{1}}被填充,PersonViewModel列表中的元素的数量,以及Legs中的每个LegViewModel list不会:Length属性保持为0,我希望Legs数组包含一个Length 45的元素。

请注意,当我根本不使用列表时,这也是相同的:具有以下内容会产生非空PersonViewModel.Legs property, but still as the Legs.Length`属性为0:

// view model
public class PersonViewModel
{
    public int Height { get; set; }
    //public List<LegViewModel> Legs {get;set;}
    public LegViewModel Leg { get; set; }
}

public class LegViewModel
{
    public int Length { get; set; }
}

// view
$("#mybutton").click(function () {
    $.ajax({
        type: "POST",
        data: {
            Height: 23,
            Leg: 
                {
                    Length: 45,
                }

        }
    });
})

如何使用JSON填充嵌套视图模型?有没有我错过的东西或者MVC不能做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您希望MVC Model Binder在使用$.ajax发送数据时正确解析您的集合,您需要做两件事:

  • contentType设置为'application/json'
  • 您的data应该保留JSON,以便JSON.stringify数据

所以这是正确的用法,然后可以由模型绑定器解析:

$("#mybutton").click(function () {
        $.ajax({
            type: "POST",
            contentType: 'application/json',
            data: JSON.stringify({
                Height: 23,
                Legs: [
                    {
                        Length: 45,
                    }
                ]
            })
        });
    });