ASP.NET:使用嵌套集合数据绑定和更新对象

时间:2009-03-26 16:12:12

标签: c# asp.net data-binding

我用“Person”类制作了一个小例子,其中包含Pets列表。此外,还有一个可以保存/删除/选择Person对象的简单存储库。 现在我在表单上放置一个表单视图(或详细信息视图),选择一个指向我的存储库的对象数据源。到目前为止,它完美地运作,我可以创建,更新,删除人...我甚至可以在我的视图中显示我的宠物集合在项目模板中。

但是当我更新一个人时,我的宠物收集就被清除了!当我查看对象绑定源的“正在更新”事件时,e.InputParameters包含我输入的所有值,但pets集合始终包含0个项目。当我查看对象绑定源的Selected事件时,我的e.ReturnValue包含我选择的人,包括宠物,这是正确的。有什么想法吗?

这是我的人员类和我的存储库。这是一个实际上是linq2hibernate项目的小样本。

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public List<Pet> Pets { get; set; } 

    public Person() 
    { 
        Pets = new List<Pet>(); 
    } 
}

[DataObject] 
public class Repository 
{ 
    List<Person> people = new List<Person>(); 

    public Repository() 
    { 
         //Code to load the person list 
    } 

    public Person FindByID(int ID) 
    { 
        return people.SingleOrDefault(x => x.ID == ID); 
    } 

    public List<Person> FindAll() 
    {                         
        return people; 
    }         

    public void Save(Person person) 
    { 
       // code to save a person 
       // Here you can see a person's pets collection is always empty  
       // when this method is called by the objectdatasource 
    } 

    public void Delete(Person person) 
    { 
    }        

    public void Insert(Person person) 
    { 
    } 
}

1 个答案:

答案 0 :(得分:0)

我相信这是设计上的。传递给Save方法的对象与您正在编辑的对象不同。对象绑定源在调用Save方法时创建Person的 new 实例。它使用反射分配属性,并仅分配在键/值集合中设置的属性。即那些你的DetailsView有数据绑定的那些,特别是来自DetailsViewUpdatedEventArgs.Keys,NewValues和OldValues。

这是有道理的,因为您没有更新Pets系列,只有人员记录。我建议,在Save你打电话给你的FindByID并重新分配过往的人的价值 - 宠物将保持不变。

我认为也可以养宠物。如果我理解正确,则需要编写自定义序列化程序并将Person标记为Serializable。我没试过。