0

私はこれについて頭を悩ませてきました。助けていただければ幸いです。

カスタム 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 をデータベースに格納されているバイト配列にシリアル化する方法を知っている人はいますか?

4

2 に答える 2

1

PersonalizationProvider ではなく、SQLPersonalizationProvider からプロバイダーを継承してみてください。この方法では、FindState、ResetState、ReserUserState、および GetCountOfState メソッドを実装する必要はありません。

数ヶ月前、私はそれらのバイトをデコードしようとしていましたが、実際にはこのトリックを使用してそれを記述する必要がないことを発見してあきらめました。

しかし、それは完璧な解決策ではないと思います。プロバイダーが Oracle、MySql、または SQL Server 以外のものを使用している場合、パーソナライズ プロバイダーの Initialize メソッドを呼び出した後、データベース内の aspnet 標準ストアド プロシージャを要求し始めることがわかります。

于 2009-12-04T12:45:33.097 に答える
0

この実装ガイドは私のために働いた - http://www.codeproject.com/Questions/83150/SqlPersonalizationProvider-Methods

于 2012-01-11T19:38:15.020 に答える