Web パーツをアップグレードする
最終更新日: 2011年9月1日
適用対象: SharePoint Foundation 2010
ここでは、最適かつ包括的な方法で Web パーツをアップグレードする方法について説明します。この方法では、Web パーツが SharePoint Foundation、ハイブリッド、または ASP.NET Web パーツかどうか、Web パーツの種類が変換されるかどうか、どのようなアップグレード操作が実行されるか、アップグレードが実行される、または実行されない状況について考慮します。新しいバージョンの Web パーツを作成し、以前のバージョンの Web パーツに保存されたプロパティ値でアップグレード ロジックを実行する必要がある場合、Microsoft SharePoint Foundation 2010 では次のオプションを利用できます。
AfterDeserialize を実装する
古いバージョンがすべて Microsoft SharePoint Foundation Web パーツで、新しいバージョンが SharePoint Foundation 2010 Web パーツまたはハイブリッド Web パーツの場合は、AfterDeserialize() メソッドを実装して Web パーツをアップグレードします。古いバージョンが新しいバージョンに逆シリアル化されると必ずこのメソッドが呼び出され、Web パーツがページで静的か (つまりゾーン外)、動的か (つまりゾーン内)、またはオブジェクト モデルの呼び出しによってインスタンス化されている場合、これは true です。ただし、この AfterDeserialize() は、古い逆シリアル化されたバージョンが新しいバージョンにアップグレードされるときに一度呼び出されるだけで、Web パーツがハイブリッド Web パーツにアップグレードされた後は AfterDeserialize() は呼び出されません。したがって、SharePoint Foundation Web パーツをハイブリッド Web パーツに変換した場合、それがハイブリッド Web パーツとして展開された後に、アップグレード ロジックをそのハイブリッド Web パーツに追加するには、AfterDeserialize() メソッドを実装して、ハイブリッド Web パーツ 2.0 への SharePoint Foundation Web パーツのアップグレードを処理する必要があります。また、以下で説明するインターフェイスを実装し、ハイブリッド Web パーツ 1.0 からハイブリッド Web パーツ 2.0 へのアップグレードも処理しなければなりません。これを実現するために、AfterDeserialize() メソッドとインターフェイスの両方の実装が呼び出す共有アップグレード関数 (ここでは TransformMyString) を作成することをお勧めします。
古いバージョンの Web パーツがハイブリッド Web パーツまたは ASP.NET Web パーツで、新しいバージョンもハイブリッド Web パーツまたは ASP.NET Web パーツの場合、AfterDeserialize() は呼び出されず、実行するアップグレードの種類に応じて、Web パーツのアップグレード ロジックを OnInit()、EndLoad()、およびLoad() から呼び出す必要があります。
AfterDeserialize() メソッドを使用する方法の詳細については、「Web パーツ アセンブリのアップグレード」および「AfterDeserialize()」を参照してください。
プロパティの状態を検出する
SampleProperty と呼ばれる文字列プロパティがあり、書式が変更されたので、アップグレード コードで SampleProperty の内容を古い書式から新しい書式に変換する必要があるとします。この場合は、TransformSampleProperty メソッドを作成することをお勧めします。このメソッドでは、SampleProperty が既に変換されているかどうかを効率的に検出し、変換されていない場合は、変換を実行します。以下の例は、その方法を簡単に示しています。
using Asp = System.Web.UI.WebControls.WebParts
public class MyWebPart : Asp.WebPart
{
private m_dirty = false;
[Insert your standard Web Part logic here…]
private void TransformMyString()
{
if ([SampleProperty is in the old format…])
{
[Transform the SampleProperty value to the new format…]
m_dirty = true;
}
if (m_dirty && null != WebPartManager)
{
SetPersonalizationDirty();
m_dirty = false;
}
}
}
TransformSampleProperty を OnInit() メソッドおよび EndLoad() メソッドから呼び出すと、Web パーツがページで静的か、動的か、またはオブジェクト モデルの呼び出しによってインスタンス化されている場合は、アップグレード コードが必ず呼び出されます。アップグレード後に TransformSampleProperty が "upgraded" または "verson" プロパティを設定できるように、また、TransformSampleProperty への以降の呼び出しによって My String が既にアップグレードされているかどうかが効率的に検出されるように、その "upgraded" または "verson" プロパティを Web パーツに追加しなければならないことがあります。"version" プロパティは他の Web Part プロパティと共にストアに保持されるので、このプロパティを保存する場合は、IPersonalizable インターフェイスを使用することを検討してください。ただし、このプロパティは、Web パーツのプロパティを編集しているときにツール ウィンドウ UI に表示されません。また、Microsoft SharePoint Designer で Web パーツを編集しているときは、その Web パーツのマークアップに表示されません。
前の例では、Web パーツが逆シリアル化されるとすぐに EndLoad() が呼び出されます。これは true で、SampleProperty が古い書式であることを示すので、SampleProperty 値を変換するコードが実行されます。Web パーツはまだ WebPartManager に追加されていないので、MyWebPart.WebPartManager は null のままで、SetPersonalizationDirty は呼び出されません。Web パーツが、ページの WebPartManager に追加された後、そのライフサイクルは最新になり、MyWebPart.OnInit が呼び出されます。ただし、これは false になり、MyString が古い書式であることを示し、MyWebPart.WebPartManager が有効になります。したがって、SetPersonalizationDirty が呼び出され、これにより、現在のユーザー権限に関係なく、アップグレードされた Web パーツがコンテンツ データベースに自動保存されます。
Web パーツがページで静的の場合、Web パーツのアップグレード コードの実行後は、ページのマークアップを変更できません。これは、マークアップは常にアップグレード前の状態のままで、ページが参照されると必ずアップグレード コードが OnInit() で再実行されることを意味します。SQL Server のコンテンツ データベースが読み取り専用でありながら、Web パーツがプロパティをそのデータベースに書き戻そうとするケースは特別です。これが発生するのは、Web パーツのアップグレードが各インスタンスの初回使用時まで事実上延期され、データベースが読み取り専用のときに最初の使用が発生することがあるからです。Web パーツでレンダリングが行われますが、更新はデータベースに故意に保存されません。
プロパティ名を変更する
古いバージョンにプロパティ X があり、新しいバージョンではその名前を Y に変更したとします。この場合は、Load() を実装し、X への保存で使用した値を Y にコピーして、ダーティ フラグを設定します。次に、OnInit() メソッドでダーティ フラグを確認し、SetPersonalizationDirty を呼び出します。以下の例は、その方法を簡単に示しています。
using Asp = System.Web.UI.WebControls.WebParts
public class MyWebPart : Asp.WebPart
{
private m_dirty = false;
[Standard Web Part logic here...]
void IVersioningPersonalizable.Load(IDictionary unknownProperties)
{
[Copy X into Y here…]
m_dirty = true;
}
protected override void OnInit(EventArgs e)
{
if (m_dirty && null != WebPartManager)
{
SetPersonalizationDirty();
m_dirty = false;
}
}
}
前の例では、パーツが動的であるか、オブジェクト モデル呼び出しによってインスタンス化されている場合に、Load() メソッドが呼び出されています。ただし、このメソッドは、Web パーツがページで静的の場合は呼び出されていません。
ユーザーの資格情報にかかわらず、Web パーツ フレームワークによって IVersioningPersonalizable インスタンスのメソッドが呼び出されます。前の例で IVersioningPersonalizable コードが Web パーツをダーティとして適切にマークしている場合は、資格情報を確認しない内部コードを使用して、アップグレードされた Web パーツがストアに自動保存されます。この結果、最初にページを参照するのが閲覧者のように権限が制限されているユーザーであっても、アップグレードは引き続き期待どおりに実行されます。
Web パーツがページで静的の場合、Load() は呼び出されません。ただし、OnInit() 呼び出しでコードを追加し、Web パーツの expando プロパティ (Web パーツ フレームワークの概念ではなく Asp.Net コントロールの概念) を確認して、expando プロパティの X 値をコピーし、これを Y に割り当てることができます。さらに、この場合、Web パーツのアップグレード コードの実行後は、ページのマークアップを変更できません。これは、マークアップは常にアップグレード前の状態のままで、ページが参照されると必ず OnInit() アップグレード コードが再実行されることを意味します。
関連項目
概念
SharePoint Foundation の Web パーツ