发布到我的MVC 4控制器时,为什么我父对象中的嵌套对象为null?

时间:2013-08-15 15:20:36

标签: asp.net-mvc asp.net-mvc-4 entity-framework-5 asp.net-mvc-controller

假设我有一个包含自定义类的复杂模型:

    public class Car
{
    public Car() {}
    public Engine engine { get; set } // nested object
    public int FuelRemaining {get; set;}
    public int VehicleStatus {get; set;}
}

一个看起来像这样的MVC 4控制器:

    [HttpPost]
    public PartialViewResult ShowVehicleDetails(Car currentVehicle)
    {
        return PartialView(currentVehicle);
    }

如果我使用ajax帖子将此类的实例传递给控制器​​,然后尝试返回视图,部分视图,甚至只是查看对象, engine null ,但其他一切都很好。

这里是我看到的JSON示例,显示在POST请求标头的表单数据中:

{"engine":{"engineVIN":258736,"engineKM":160015,"EngineDesc":"EcoTech V8"},"FuelRemaining":90,"VehicleStatus":1}

注意: FuelRemaining VehicleStatus 的值在控制器和结果视图中显示正常。

有人可以向我解释为什么会这样,以及如何最好地解决这个问题?

我确实遇到了来自asp.net团队的this blog article,但它是2010年的日期,我无法找到更新的信息。

2 个答案:

答案 0 :(得分:1)

模型绑定中的对象只能使用发布的值进行水合。因此,如果您的帖子中没有与asscoiated Engine对象相对应的值,则不会填充任何属性。

默认模型绑定将在action方法的参数列表中创建它看到的一个或多个对象的新实例。如果您希望模型绑定从数据库中提取现有对象,则需要一个自定义模型绑定器。

答案 1 :(得分:1)

仔细观察我在网上发现的将复杂对象传递给控制器​​的样本,清楚地表明我在进行ajax调用时忽略了设置 contentType

具体来说,工作电话应如下所示:

        var jsonData = { "StartDate": selectedDate, "EndDate": selectedDate };

    $.ajax(
            {
                url: '@Url.Action("GetMyConcertTickets", "Main")',
                type: 'POST',
                data: JSON.stringify(jsonData),
                contentType: 'application/json',
                cache: false,
                success: function (data) {
                    populateMyConcertTicketsOnGrid(data);
                }
            });

如果您没有告诉控制器您正在传递“application / json”,那么我认为它会指望“text / html”