2012-10-25 18 views
5

Chúng ta đang gặp phải một vấn đề lạ khi sử dụng phương thức GetItems và chuyển từng mục trong bộ sưu tập đã trả về sang phương thức khác.Truy cập các thuộc tính của đối tượng TOM.NET khi truyền chúng giữa các phương thức sau khi GetItems (bộ lọc) gọi

Chúng tôi đang ở trên Tridion 2011 GA.

Sau đây mã được phá vỡ:

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

Tuy nhiên, nếu sg.Directory là truy cập trước khi đi sg vào phương pháp tiếp theo, tất cả hoạt động tốt:

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

Nó cảm thấy rằng có một cái gì đó đang xảy ra với phương thức GetItems() mà nó không trả về đối tượng đầy đủ, và một khi truyền đối tượng được tải một phần sang phương thức tiếp theo, nó không thể nạp các thuộc tính như thể tham chiếu ban đầu bị mất.

Ai đó có thể làm sáng tỏ một số điều đang xảy ra ở đây không? Ngoài ra, nó là xấu để vượt qua đối tượng TOM.NET giữa các phương pháp?

Cảm ơn

Trả lời

2

Điều đó có vẻ thực sự kỳ lạ - trong thực tế, tôi không thể tái tạo vào năm 2011 GA - Tôi dán chức năng của bạn thành một TBB NET và thực hiện từ các công cụ tạo mẫu - cả hai phương pháp sản lượng thư mục tốt. Đây công việc có lẽ sẽ không như dự đoán tinh khiết của nó, nhưng một vài điều để thử:

  1. filter.BaseColumns = ListBaseColumns.Extended - Tôi nghĩ rằng đây là chỉ dành riêng cho GetListItems, nhưng bạn không bao giờ biết ...
  2. thử outputting sg.LoadState để xem của nó bằng cách nào đó không được nạp đầy đủ

Nếu vẫn thất bại, sử dụng GetListItems, và sau đó tạo ra một đối tượng StructureGroup cho tất cả các mục mà bạn muốn xử lý (giả sử rằng bạn sẽ bỏ qua một số SG từ sitemap dựa trên sg.Title) . Đó là một chút xấu hổ rằng không có thuộc tính url cho dữ liệu được trả về từ GetListItems, nếu không bạn có thể làm tất cả trong một lần với Publication.GetListItems(), với bộ lọc đệ quy chỉ dành cho SG (hoặc SGs và Pages).

2

Nếu đề xuất của Will không hoạt động, bạn luôn có thể cố gắng có biến lớp SG làm bộ đệm, được đặt cho từng mục trong vòng lặp, sau đó bạn chỉ cần gọi phương thức GetSiteMap mà không qua sg. Không phải là giải pháp sạch nhất nhưng nó có giá trị một thử nếu không có gì khác hoạt động.

Các vấn đề liên quan