Мой приемник функции SharePoint активирует функцию определения списка, но мой код не видит шаблон списка до второго прохода

Я уже шестой час борюсь с тем, что, надеюсь, должно иметь простое решение, поэтому я подумал, что опубликую здесь.

У меня есть функция с приемником функций, единственная цель которой - активировать развернутую функцию определения списка, а затем создать экземпляр этого нового определения списка.

Функция определения списка, называемая «Пользовательский список доступа», работает в сети.

Итак, мой приемник функций активирует эту функцию определения списка, имея GUID "1E503BDA-803B-4a1a-A042-019FA1A70C4C":

...
string featureGuid = "1E503BDA-803B-4a1a-A042-019FA1A70C4C";        // my 'Custom     try
{
    SPFeatureCollection featureCollection = web.Features;
    featureCollection.Add(new Guid(featureGUID), true); // activat the 'Custom Access List' feature
}
catch (Exception e)
{
    // log exception
}

Этот код выполняется нормально, функция определения списка активируется, и новое определение списка появляется в пункте меню сайта «Создать» в пользовательском интерфейсе.

Однако здесь начинается моя проблема. Следующая строка моего кода приемника функций затем пытается создать экземпляр этого недавно доступного списка:

SPListTemplate listTemplate = web.ListTemplates["Custom Access List"];            // exception! Value does not fall within the expected range
web.Lists.Add("My new custom access list","", listTemplate);

Но строка SPListTemplate listTemplate = web.ListTemplates ["Пользовательский список доступа"]; выдает исключение с сообщением "Значение не попадает в ожидаемый диапазон". - шаблон списка, несмотря на то, что он развернут, видим и доступен в пользовательском интерфейсе в меню действия «Создать» сайта, не может быть найден в коде получателя.

Отладка кода подтверждает, что web.ListTemplates SPListTemplateCollection не содержит записи для этого нового «настраиваемого списка доступа», несмотря на то, что пользовательский интерфейс предлагает иное.

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

SPListTemplate listTemplate = web.ListTemplates["Custom Access List"];            // found this time. It sees it the second time around
web.Lists.Add("My new custom access list","", listTemplate);      // works fine

Итак, в двух словах - изначально, после активации функции, которая через код получателя активирует функцию определения списка, это определение списка не отображается до тех пор, пока не будет произведена обратная передача или некоторая форма «обновления SPWeb. ". Тогда видно.

Я что-то упустил? Вызов web.Update () здесь:

try
{
    SPFeatureCollection featureCollection = web.Features;
    featureCollection.Add(new Guid(featureGUID), true); // true to force activation
    web.Update();
}
...

ничего не делает. Есть ли способ «обновить» объект SPWeb, чтобы можно было увидеть и использовать новый шаблон списка?

На данный момент я нашел обходной путь: добавить функцию шаблона списка «Пользовательский список доступа» в качестве зависимости активации в самом «родительском» приемнике функции и сделать скрытой функцию шаблона списка «Пользовательский список доступа». Таким образом, насколько мне известно, функция определения настраиваемого списка активируется принудительно, и я обнаружил, что обнаружен web.ListTemplates ["Custom Access List"];.

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


person Andrew Vevers    schedule 21.01.2010    source источник


Ответы (3)


Эндрю,

Проблема связана с внутренними асинхронными событиями и временем действия. Как вы говорите, если вы уйдете и вернетесь, это сработает, то есть событие async завершено. Вы обрабатываете featureCollection.Add как метод синхронизации.

Что вам действительно следует делать, если вам нужен шаблон и экземпляр списка, созданный одновременно, для этого используется структура XML.

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

Эндрю

person AndrewWoody    schedule 22.01.2010
comment
Отлично - большое спасибо, Андрей. Я внесу эти изменения. Эндрю - person Andrew Vevers; 22.01.2010

Вам нужно вызвать EnsureListsData для только что обновленной коллекции SPListCollection.

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistcollection.ensurelistsdata.aspx

person Jeff    schedule 21.01.2010
comment
Спасибо за ответ, но разве этот метод не ищет существующий список instance? Мне нужно убедиться, что список template можно найти, чтобы впоследствии я мог создать экземпляр списка. (Также, похоже, что intellisense не предлагает этот конкретный метод после того, как я получил объект SPListCollection.) Эндрю - person Andrew Vevers; 22.01.2010

Похоже, что шаблон списка еще не создан. Вы можете попробовать сделать цикл и дождаться его создания

        using(SPWeb web = site.OpenWeb())
        {
            SPListTemplate listTemplate = null;
            while (listTemplate == null)
            {
                Thread.Sleep(1000);
                try
                {
                    listTemplate = web.ListTemplates["Custom Access List"];
                    if (listTemplate != null)
                    {
                        // here your code 
                        web.Lists.Add("My new custom access list", "", listTemplate);
                    }
                }
                catch
                {
                    web = site.OpenWeb();
                }
            }
        }
person Ciprian Grosu    schedule 22.01.2010