如何在将从WebPartManager派生的类移动到新程序集时保持个性化

本文关键字:程序集 个性化 移动 WebPartManager 派生 | 更新日期: 2023-09-27 18:27:39

我们有一个多年前开始的网站项目。登录页使用可个性化的web部件,web部件管理器是.NET WebPartManager类的扩展,位于App_Code中。奇怪的是,如果我们将这个类移到同一解决方案中的另一个程序集中,个性化就会被清除,我们可以保存新的个性化。但当我们将类移回时,它会再次加载原始的个性化设置。在asp_PersonalizationPerUser表中,PathId、UserId和ApplicationId似乎都保持不变(请参见http://msdn.microsoft.com/en-us/library/aa478955.aspx详细信息。)

更新:我之所以这么问,是因为我们需要将我们的项目转换为Web应用程序项目,并且我们不想在每天使用该应用程序的500名用户中造成任何干扰。我已经为转换放了一个架子,除了这个问题,一切似乎都解决了。

更新2:我突然想到我需要重新措辞我的问题。

将从WebPartManager派生的类移动到新程序集时,如何保持个性化

如何在将从WebPartManager派生的类移动到新程序集时保持个性化

因为实现非常复杂,而且是.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.

除了通过用户名和路径界定个性化状态之外,SqlPersonalizationProvider支持按应用程序名称确定作用域。注册个性化提供商的网站applicationName属性共享Web部件个性化数据,而注册个性化提供商的网站applicationNames没有。由于页面特定和控件特定然而,个性化数据的本质通常是没有意义的对Web部件个性化数据使用相同的applicationName跨不同网站。

您的新Web应用程序项目的applicationName是否与旧项目不同?