将表单数据传递给控制器​​方法 - 子属性未填写

时间:2011-05-11 15:15:38

标签: asp.net-mvc rest javascriptmvc

我的应用程序在客户端使用JavascriptMVC,而ASP MVC基本上只作为REST服务运行。这是一种典型的控制器方法:

public JsonResult Update(CustomerDto dto)
{
  var repository = Factory.NewCustomerRepository())
  // ... Convert DTO back to entity and save changes
  return Json(dto);
}

问题是,我的CustomerDTO包含一些未从表单数据转换为它们应该是的对象的属性。例如,PhoneNumbers:

public class CustomerDto
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public PhoneNumberDto[] PhoneNumbers { get; set; }
    // ... more properties
}
public class PhoneNumberDTO
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public string Label { get; set; }
    public string Number { get; set; }
}

在控制器操作中,PhoneNumbers将在数组中具有正确数量的元素,但每个对象将只具有null / default值。我已经验证了请求正在发送所有相应的表单数据:

Id          26
FirstName   A
LastName    Person
MiddleName  Test
PhoneNumbers[0][CustomerID  26
PhoneNumbers[0][Id] 5
PhoneNumbers[0][Label]  Mobile
PhoneNumbers[0][Number] (555)555-5555
PhoneNumbers[1][CustomerID  26
PhoneNumbers[1][Id] 8
PhoneNumbers[1][Label]  Home
PhoneNumbers[1][Number] (654)654-6546

关于可能发生的事情的任何想法?我认为MVC3可以自动映射表单值中的嵌套对象我是错误的吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

实际上,如果您希望默认模型绑定器成功绑定这些值(请注意PhoneNumbers[0].CustomerID而不是PhoneNumbers[0][CustomerID]),请求应该如下所示:

Id                          26
FirstName                   A
LastName                    Person
MiddleName                  Test
PhoneNumbers[0].CustomerID  26
PhoneNumbers[0].Id          5
PhoneNumbers[0].Label       Mobile
PhoneNumbers[0].Number      (555)555-5555
PhoneNumbers[1].CustomerID  26
PhoneNumbers[1].Id          8
PhoneNumbers[1].Label       Home
PhoneNumbers[1].Number      (654)654-6546

您可以查看following blog post获取用于集合的有线格式。

作为替代方案,您可以使用JSON requests