2012-10-25 9 views
5

Mamy do czynienia z dziwnym problemem podczas korzystania z metody GetItems i przekazywania każdej pozycji z zwróconej kolekcji innej metody.Uzyskiwanie dostępu do właściwości obiektów TOM.NET podczas przesyłania ich między metodami po wywołaniu funkcji GetItems (filtr)

Jesteśmy na Tridion 2011 GA.

Poniższy kod jest łamanie:

private void foo(StructureGroup structureGroup, Session session, int counterTemp, int levels) 
{ 
    OrganizationalItemItemsFilter filtersg= new OrganizationalItemItemsFilter(session); 
    filtersg.Recursive = false; 
    IEnumerable<ItemType> itemtype = new List<ItemType> { ItemType.StructureGroup}; 
    filtersg.ItemTypes = itemtype; 

    foreach (StructureGroup sg in structureGroup.GetItems(filtersg)) 
    { 
     GetSiteMap(sg, counterTemp, levels); 
    } 
} 

private void GetSiteMap(StructureGroup sg, int counter, int levels) 
{ 
    logger.Info(sg.Id); //ok 
    logger.Info(sg.Title); //ok 
    logger.Info(sg.Directory); // null !? 
} 

Jednakże, jeśli sg.Directory jest dostęp przed przekazaniem SG do następnej metody, wszystko działa bez zarzutu:

private void foo(StructureGroup structureGroup, Session session, int counterTemp, int levels) 
    OrganizationalItemItemsFilter filtersg= new OrganizationalItemItemsFilter(session); 
    filtersg.Recursive = false; 
    IEnumerable<ItemType> itemtype = new List<ItemType> { ItemType.StructureGroup}; 
    filtersg.ItemTypes = itemtype; 

    foreach (StructureGroup sg in structureGroup.GetItems(filtersg)) 
    { 
     logger.Info(sg.Directory); //if printed here, all works fine down the line. 
     GetSiteMap(sg, counterTemp, levels); 
    } 
} 

private void GetSiteMap(StructureGroup sg, int counter, int levels) 
{ 
    logger.Info(sg.Id); //ok 
    logger.Info(sg.Title); //ok 
    logger.Info(sg.Directory); // ok } 
} 

Czuje, że dzieje się coś z metodą GetItems(), która nie zwraca pełnego obiektu, a po przejściu częściowo załadowanego obiektu do następnej metody nie jest w stanie wczytać właściwości tak, jakby utracono oryginalne odniesienie.

Czy ktoś może rzucić trochę światła na to, co się tutaj dzieje? Ponadto, czy przekazywanie obiektów TOM.NET między metodami jest złe?

Dzięki

Odpowiedz

2

który wydaje bardzo dziwne - w rzeczywistości nie można odtworzyć na 2011 GA - I wklejać swoje funkcje do TBB .NET i wykonany z konstruktora szablonu - obie metody wyjścia katalog dobrze. To chyba przyzwyczajenie praca jako czystej domysłów, ale kilka rzeczy, aby spróbować:

  1. filter.BaseColumns = ListBaseColumns.Extended - Myślę, że to jest właśnie dla GetListItems, ale nigdy nie wiadomo ...
  2. próby wyprowadzania sg.LoadState aby sprawdzić, czy jej jakoś nie w pełni załadowany

Jeśli wszystko inne zawiedzie, użyj GetListItems, a następnie utworzyć obiekt StructureGroup dla każdego elementu, który ma przetwarzać (zakładając, że można pominąć niektóre SGS z mapy witryny opartej na sg.Title) . Szkoda tylko, że nie ma atrybutu url dla danych zwracanych przez GetListItems, w przeciwnym razie można by to wszystko za jednym zamachem z Publication.GetListItems(), z filtrem rekursywnym tylko dla GP (lub SG i stron).

2

Jeśli sugestia Willa nie działa, zawsze możesz spróbować ustawić zmienną klasy SG jako bufor, który zostałby ustawiony dla każdego elementu w pętli, a następnie po prostu wywołaj metodę GetSiteMap bez przekazywania sg. Nie najczystsze rozwiązanie, ale warto spróbować, jeśli nic innego nie działa.

Powiązane problemy