0

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

    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 post 将此类的实例传递给控制器​​,然后尝试返回视图、部分视图,甚至只是查看对象,引擎的所有值都是null,但其他一切都很好。

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

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

注意:FuelRemainingVehicleStatus的值在控制器和结果视图中显示得很好。

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

我确实从 asp.net 团队看到了这篇博客文章,但它是 2010 年的,我无法找到任何更新的信息。

4

2 回答 2

2

仔细查看我在网上找到的将复杂对象传递给控制器​​的示例,清楚地表明我在进行 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"

于 2013-08-16T13:57:22.043 回答
1

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

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

于 2013-08-15T15:29:00.003 回答