ASP.NET: привязка данных и обновление объектов с помощью вложенных коллекций - PullRequest
3 голосов
/ 26 марта 2009

Я сделал небольшой пример с классом 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 голосов
/ 27 марта 2009

Я верю, что это так. Объект, который передается в метод Save, не является тем же объектом, который вы редактируете. Источник привязки объекта создает новый экземпляр Person при вызове метода Save. Он назначает свойства, используя отражение, и только те, которые установлены в коллекциях ключей / значений. То есть те, которые в вашем DetailsView связаны с данными, в частности из DetailsViewUpdatedEventArgs.Keys, NewValues ​​и OldValues.

Это имеет смысл, так как вы не обновляете коллекцию Pets, только запись Person. Я полагаю, что при сохранении вы вызываете свой FindByID и переназначаете значения от переданного человека - домашние животные останутся прежними.

Я думаю, что возможно и домашние животные тоже есть. Если я правильно понимаю, потребуется написать собственный сериализатор и пометить человека как сериализуемый. Я еще не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...