我们有一个多年前开始的网站项目。登录页面使用可个性化的Web部件,Web部件管理器是.NET WebPartManager类的扩展,驻留在App_Code中。奇怪的是,如果我们将这个类移动到同一个解决方案中的另一个程序集中,个性化就会被清除,我们可以节省新的个性化。但是,当我们将课程移回时,它会再次加载原始个性化。 PathId,UserId和ApplicationId似乎在asp_PersonalizationPerUser表中保持不变(有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa478955.aspx。)
更新:我问的原因是因为我们需要将项目转换为Web应用程序项目,并且我们不希望在每天使用该应用程序的500个用户中造成任何中断。我把一个shelveset放在一起进行转换,除了这个问题外,一切似乎都已解决了。
更新2:我发现我需要重新提出问题。
在将从WebPartManager派生的类移动到新程序集时,如何保持个性化?
答案 0 :(得分: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.
答案 1 :(得分:0)
除了按用户名和路径确定个性化状态外, SqlPersonalizationProvider支持按应用程序名称进行范围设定。 注册个性化提供商的网站相同 applicationName属性共享Web部件个性化数据, 而注册个性化提供商的网站则具有独特性 applicationNames没有。由于页面特定和控件特定 然而,个性化数据的本质通常没有意义 对Web部件个性化数据使用相同的applicationName 跨越不同的网站。
您的新Web应用程序项目是否具有与旧的不同的applicationName?