私はこれについて頭を悩ませてきました。助けていただければ幸いです。
カスタム PersonalizationProvider、カスタム WebPartManager、およびカスタム WePart クラスがあります。ユーザーごとのパーソナライゼーション データを格納するためのカスタム データ テーブルがあります。私のタスクは、各ユーザーが追加したすべての Web パーツをプログラムでループ処理して、パーソナライズ可能な属性を設定できるようにすることです。
ドキュメントによると、FindState メソッドは、指定された PersonalizationStateQuery の PersonalizationStateInfoCollection を返します。
PersonalizationStateQuery pq = new PersonalizationStateQuery();
pq.PathToMatch = path;
pq.UsernameToMatch = userName;
int count;
CustomPersonalizationProvider provider= new CustomPersonalizationProvider();
PersonalizationStateInfoCollection pcol = provider.FindState(PersonalizationScope.User, pq, 0, Int32.MaxValue, out count);
PersonalizationProvider は抽象クラスであるため、カスタム クラスの FindState メソッドに独自の実装を提供する必要があります。過去 6 時間かけて何かを見つけようとしましたが、この方法を実装する方法がわかりません。
PersonalizationData は blob です。オブジェクト配列に逆シリアル化できました。しかし、それ以上はありません。そのブロブを PersonalizationStateInfoCollection にシリアル化/逆シリアル化する方法がわかりません。
String BlobString = Convert.ToBase64String(UserDataBlob);
ObjectStateFormatter formatter = new ObjectStateFormatter();
Object[] DeserializedObjects = (Object[])formatter.Deserialize(BlobString);
WebPartManager が UserPersonalizationData をデータベースに格納されているバイト配列にシリアル化する方法を知っている人はいますか?