私は、うまくいけば簡単な解決策があるべきものと戦っている6時間目に入っているので、ここに投稿しようと思いました.
展開されたリスト定義機能をアクティブ化し、その新しいリスト定義のインスタンスを作成することだけを目的とする機能レシーバーを備えた機能があります。
「カスタム アクセス リスト」と呼ばれるリスト定義機能は、Web を対象としています。
したがって、フィーチャー レシーバーは、GUID "1E503BDA-803B-4a1a-A042-019FA1A70C4C" を持つこのリスト定義機能をアクティブにします。
...
string featureGuid = "1E503BDA-803B-4a1a-A042-019FA1A70C4C"; // my 'Custom try
{
SPFeatureCollection featureCollection = web.Features;
featureCollection.Add(new Guid(featureGUID), true); // activat the 'Custom Access List' feature
}
catch (Exception e)
{
// log exception
}
このコードは正常に実行され、リスト定義機能が有効になり、新しいリスト定義が UI の [作成] サイト メニュー オプションに表示されます。
ただし、これが私の問題の始まりです。フィーチャー レシーバー コードの次の行は、この新しく利用可能になったリストのインスタンスを作成しようとします。
SPListTemplate listTemplate = web.ListTemplates["Custom Access List"]; // exception! Value does not fall within the expected range
web.Lists.Add("My new custom access list","", listTemplate);
しかし、行SPListTemplate listTemplate = web.ListTemplates["カスタム アクセス リスト"]; 「値が期待される範囲内にありません」という例外をスローします。- リスト テンプレートは、UI の [作成] サイト メニュー アクションの下にデプロイされ、表示され、使用可能になっているにもかかわらず、レシーバー コードで見つかりません。
コードをデバッグすると、web.ListTemplates SPListTemplateCollectionに、この新しい「カスタム アクセス リスト」のエントリが含まれていないことが確認されます。
そして、ここに奇妙なことがあります。例外がスローされますが、コードを再実行すると、つまり UI で機能を再アクティブ化して、その機能レシーバーを再実行すると、リスト テンプレートが見つかります-
SPListTemplate listTemplate = web.ListTemplates["Custom Access List"]; // found this time. It sees it the second time around
web.Lists.Add("My new custom access list","", listTemplate); // works fine
つまり、簡単に言えば、最初に、レシーバー コードを介してリスト定義機能をアクティブ化する機能をアクティブ化した後、そのリスト定義は、「ポストバック」または何らかの形式の「SPWeb 更新」の後まで表示されません。それからそれは見えます。
ここで何か不足していますか?ここでの web.Update() の呼び出し:
try
{
SPFeatureCollection featureCollection = web.Features;
featureCollection.Add(new Guid(featureGUID), true); // true to force activation
web.Update();
}
...
何もしません。新しいリスト テンプレートを表示して使用できるように、SPWeb オブジェクトを "更新" する方法はありますか?
今のところ、私が見つけた回避策は、「カスタム アクセス リスト」リスト テンプレート機能をアクティブ化の依存関係として「親」機能レシーバー自体に追加し、「カスタム アクセス リスト」リスト テンプレート機能を非表示にすることです。そうすれば、私の知る限り、カスタム リスト定義機能が強制的にアクティブ化され、web.ListTemplates["Custom Access List"];が見つかります。見つかった。
しかし、私はむしろ前者のアプローチを使用したいと考えています。つまり、受信側のコードでリスト定義機能を有効にしてから、リストのインスタンスを作成できるようにそれを見つけます。