2012-06-03 140 views
0

我有2款,员工和负责人:MVC 3 /实体框架:绑定集合

public class Employee 
{ 
    [Key] 
    public int Id { get; set; } 
    public int? PersonId { get; set; } 

    [ForeignKey("PersonId")] 
    public virtual Person Person { get; set; } 

} 

public class Person 
{ 
    public IList<PhoneNumber> PhoneNumbers { get; set; } 
    public int Id { get; set; } 
    public string FName { get; set; } 
    public string LName { get; set; } 
    public Person() 
    { 
     PhoneNumbers = new List<PhoneNumber> 
          { 
           new PhoneNumber() 
          };  
    } 
} 

编辑模板电话:

  @Html.TextBoxFor(x => x.Number) 
     @Html.DropDownListFor(m => m, new SelectList(Enum.GetNames(typeof (WebMVC.Core.Common.PhoneType)))) 

为了减少混乱,我删除了其他(非相关)属性。

我遇到的困难是在Employee Create()中,我可以绑定人员FName & LName,我无法绑定PhoneNumbers集合。

我知道2008年的哈克博客,但我不认为这反映了这种情况。

有没有人知道一个解决方案来绑定员工的Create()中的人员电话号码集合?

+0

当你说在创建视图中“无法绑定”它们时,你是什么意思?它只是不显示电话号码属性?它是否显示它们,但不保存在保存操作中?提供更多细节。 – StriplingWarrior

+0

相对于电话号码类的属性名称确实出现在调试(即号码,电话类型)中,但它们的值为空。此外,无论我添加多少个电话号码(通过添加新电话),集合仍然是1,并且正如我之前所说的,所有值都为空。 – aaa

+0

您的编辑器视图代码生成的是什么html?什么参数名称/值对被发送到保存操作? – StriplingWarrior

回答

1

我不知道从编辑模板中的HTML的样子,但绑定到自定义类型的集合,它应该是这个样子:

<input name="[0].Number"> 
<input name="[0].PhoneType"> 
<input name="[1].Number"> 
<input name="[1].PhoneType"> 
<input name="[2].Number"> 
<input name="[2].PhoneType"> 
2

我不是,如果******中国完全确定是您创建的自定义类,或者是构建在框架中的类。但是,如果您将MVC3映射发布数据映射到您指定的Employee类时遇到问题,您可能需要查看创建自定义绑定。请记住,如果你的编辑器模板代码不正确,这不会太重要,所以我会首先看看使用提琴手的那个。

这里有几个很好的网站可以帮助你开始,我发现它们都是在某一点上。 http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx http://odetocode.com/blogs/scott/archive/2009/05/05/iterating-on-an-asp-net-mvc-model-binder.aspx http://www.singingeels.com/Articles/Model_Binders_in_ASPNET_MVC.aspx

创建定制绑定使您认为MVC解析您发布模型数据和填充物的方式完全控制。大多数人会覆盖2个主要功能,CreateModelBindModelBindModel是您希望覆盖的功能,如果这是您想要的方式。