4

我们有一个多年前开始的网站项目。登录页面使用可个性化的 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 回答
0

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

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

于 2013-08-19T16:42:37.353 回答