自定义个性化提供程序 - 实现FindState方法

时间:2009-11-06 22:52:47

标签: web-parts personalization

我一直在打破这个问题。我感谢任何帮助。

我有自定义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。我可以将它反序列化为对象数组。但没有更进一步。我不知道如何将该blob序列化/反序列化为PersonalizationStateInfoCollection。

String BlobString = Convert.ToBase64String(UserDataBlob);
ObjectStateFormatter formatter = new ObjectStateFormatter();
Object[] DeserializedObjects = (Object[])formatter.Deserialize(BlobString);

有谁知道WebPartManager如何将UserPersonalizationData序列化为存储在数据库中的字节数组?

2 个答案:

答案 0 :(得分:1)

尝试从SQLPersonalizationProvider而不是PersonalizationProvier继承您的提供程序。这样您就不必实现FindState,ResetState,ReserUserState和GetCountOfState方法。

几个月前,我试图解码那些字节,但是当我发现我没有用这个技巧写它时,我放弃了。

但我认为这不是一个完美的解决方案。如果您的提供者使用Oracle,MySql或除SQL Server之外的任何东西,您会发现在调用个性化提供程序的Initialize方法之后,它将开始在数据库中请求aspnet标准存储过程。

答案 1 :(得分:0)