2012-10-25 3 views
5

Uns bereitet ein seltsames Problem, wenn Sie die GetItems-Methode verwenden und jedes Element in der zurückgegebenen Auflistung an eine andere Methode übergeben.Zugreifen auf Eigenschaften von TOM.NET-Objekten beim Übergeben von Methoden nach dem Aufruf GetItems (Filter)

Wir sind auf Tridion 2011 GA.

Die folgende den Code zu brechen ist:

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 !? 
} 

Wenn jedoch der sg.Directory Zugang vor sg in die nächste Methode übergeben ist, alles funktioniert gut:

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 } 
} 

Es fühlt sich an, dass Es gibt etwas mit der GetItems() - Methode, bei der das vollständige Objekt nicht zurückgegeben wird. Sobald das teilweise geladene Objekt an die nächste Methode übergeben wurde, können die Eigenschaften nicht mehr so ​​geladen werden, als ob die ursprüngliche Referenz verloren gegangen wäre.

Kann jemand bitte etwas Licht auf das werfen, was hier passiert? Ist es auch schlecht, TOM.NET-Objekte zwischen Methoden zu übergeben?

Dank

Antwort

2

Das ist wirklich seltsam scheint - in der Tat ich nicht auf 2011 GA reproduzieren kann - ich Ihre Funktionen in eine .NET TBB eingefügt und aus dem Template Builder ausgeführt - beide Methoden gibt das Verzeichnis nur in Ordnung. Dies ist wahrscheinlich nicht funktionieren als reine Spekulation, aber ein paar Dinge zu versuchen:

  1. filter.BaseColumns = ListBaseColumns.Extended - ich denke, das ist nur für GetListItems ist, aber man weiß ja nie ...
  2. versuchen, die sg.LoadState ausgeben, um zu sehen, ob vollständig sein irgendwie nicht versagt

Wenn alle Stricke geladen, verwendet GetListItems, und dann ein StructureGroup Objekt für jedes Element erstellen, die Sie bearbeiten möchten (vorausgesetzt, dass Sie einige SGs aus der Sitemap auf sg.Title basierend überspringen werden) . Es ist ein wenig schade, dass es kein URL-Attribut für die von GetListItems zurückgegebenen Daten gibt, sonst könnten Sie alles auf einmal mit Publication.GetListItems() mit einem rekursiven Filter nur für SGs (oder SGs und Pages) tun.

2

Wenn Wills Vorschlag nicht funktioniert, können Sie immer versuchen, eine SG-Klassenvariable als Puffer zu haben, die für jedes Element in der Schleife gesetzt würde, dann rufen Sie einfach die Methode GetSiteMap auf, ohne das SG zu übergeben. Nicht die sauberste Lösung, aber es ist einen Versuch wert, wenn nichts anderes funktioniert.

Verwandte Themen