4

何年も前に開始された Web サイト プロジェクトがあります。ランディング ページはパーソナライズ可能な Web パーツを使用し、Web パーツ マネージャーは .NET WebPartManager クラスの拡張であり、App_Code にあります。興味深いのは、このクラスを同じソリューション内の別のアセンブリに移動すると、個人用設定がクリアされ、新しい個人用設定を保存できることです。しかし、クラスを元に戻すと、元のパーソナライゼーションが再度読み込まれます。PathId、UserId、および ApplicationId はすべて、asp_PersonalizationPerUser テーブルで同じままであるように見えます (詳細については、http://msdn.microsoft.com/en-us/library/aa478955.aspxを参照してください)。

更新: 私が尋ねる理由は、私たちのプロジェクトを Web アプリケーション プロジェクトに変換する必要があり、アプリケーションを毎日使用する 500 人のユーザーの間で混乱を引き起こしたくないからです。変換のためにシェルフセットを組み立てましたが、この問題を除いてすべてがうまくいっているようです。

更新 2: 質問を言い換える必要があることに気づきました。

WebPartManager から派生したクラスを新しいアセンブリに移動するときに、どのようにパーソナライズを維持できますか?

4

2 に答える 2

1

実装は非常に複雑で、.NET フレームワークの内部にあるため、カスタム ソース コードを作成してこれを管理することは現実的ではありません。代わりに、メンテナンス中にデータベース スクリプトを実行するのが最適なオプションです。例:

// Read the 'PageSettings' column from the ASP personalization tables
// into a byte array variable called 'rawData' first. Then continue:

var mems = new System.IO.MemoryStream(rawData);
var formatter = new System.Web.UI.ObjectStateFormatter();
var oldState = formatter.Deserialize(mems) as object[];

var index = oldState.ToList()
                    .FindIndex(o =>
                        o as Type != null &&
                        ((Type)o).Name.Contains("WebPartManager"));

// In our case, the derivative class name is "MyWebPartManager", you
// may need to change that to meet your requirements

oldState[index] = typeof(WebPartManager);

mems = new System.IO.MemoryStream();
formatter.Serialize(mems, oldState);
var newState = mems.ToArray();

// Write 'newState' back into the database.
于 2013-08-21T15:12:54.003 に答える