假设我有一个包含自定义类的复杂模型:
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年的日期,我无法找到更新的信息。
答案 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”。