2009-11-06 2 views
0

Я пробиваю себе голову над этим. Я ценю любую помощь.Пользовательский провайдер персонализации - Внедрить метод FindState

У меня есть пользовательский интерфейс PersonalizationProvider, пользовательский WebPartManager и пользовательский класс WePart. У меня есть таблицы пользовательских данных для хранения данных персонализации для каждого пользователя. Моя задача - программировать петлю через все веб-части, добавленные каждым пользователем, чтобы я мог установить персонализируемый атрибут.

Согласно документации, метод FindState возвращает PersonalizationStateInfoCollection для данного PersonalizationStateQuery:

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, чтобы массив байтов, который хранится в базе данных?

ответ

1

Попробуйте наследовать поставщика от SQLPersonalizationProvider вместо PersonalizationProvier. Таким образом, вам не нужно применять методы FindState, ResetState, ReserUserState и GetCountOfState.

Несколько месяцев назад я пытался декодировать эти байты, но я сдался, когда обнаружил, что мне действительно не нужно писать его, используя этот трюк.

Но я думаю, что это не идеальное решение. Если ваш провайдер использует Oracle, MySql или что-то кроме SQL Server, вы обнаружите, что после вызова метода Initialize вашего провайдера персонализации он начнет запрашивать стандартные хранимые процедуры aspnet в базе данных.