5

GetItems メソッドを使用して、返されたコレクション内の各アイテムを別のメソッドに渡すときに、奇妙な問題に直面しています。

私たちは Tridion 2011 GA を使用しています。

次のコードは壊れています:

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

ただし、次のメソッドに sg を渡す前に sg.Directory にアクセスすると、すべて正常に動作します。

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

完全なオブジェクトを返さない GetItems() メソッドで何かが起こっているように感じます。部分的に読み込まれたオブジェクトを次のメソッドに渡すと、元の参照が失われたかのようにプロパティを読み込むことができません。 .

誰かがここで何が起こっているのかを明らかにしてもらえますか? また、メソッド間で TOM.NET オブジェクトを渡すのは悪いことですか?

ありがとう

4

2 に答える 2

2

Will の提案がうまくいかない場合は、ループ内の各項目に設定される SG クラス変数をバッファーとして持つことをいつでも試みることができます。その後、sg を渡さずにメソッド GetSiteMap を呼び出すだけです。最もクリーンなソリューションではありませんが、他に何も機能しない場合は試してみる価値があります。

于 2012-10-26T08:03:33.657 に答える
2

それは本当に奇妙に思えます-実際、2011 GAでは再現できません-関数を.NET TBBに貼り付け、テンプレートビルダーから実行しました-両方の方法でディレクトリが正常に出力されます. これはおそらく純粋な当て推量ではうまくいかないでしょうが、いくつかのことを試してみてください:

  1. filter.BaseColumns = ListBaseColumns.Extended- これは GetListItems のためだけだと思いますが、わかりません...
  2. を出力しsg.LoadStateてみて、どういうわけか完全にロードされていないかどうかを確認してください

他のすべてが失敗した場合は、 を使用しGetListItemsて、処理するすべてのアイテムに対して StructureGroup オブジェクトを作成します (sg.Title に基づいてサイトマップからいくつかの SG をスキップすると仮定します)。GetListItems から返されるデータに url 属性がないのは少し残念です。それ以外の場合はPublication.GetListItems()、SG のみ (または SG とページ) の再帰フィルターを使用して、一度にすべてを実行できます。

于 2012-10-25T21:56:54.500 に答える