0

我一直在为此头疼。我很感激任何帮助。

我有一个自定义 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 序列化为存储在数据库中的字节数组?

4

2 回答 2

1

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

几个月前,我试图解码这些字节,但当我发现我真的不必使用这个技巧来编写它时,我放弃了。

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

于 2009-12-04T12:45:33.097 回答
0

本实施指南对我有用 - http://www.codeproject.com/Questions/83150/SqlPersonalizationProvider-Methods

于 2012-01-11T19:38:15.020 回答