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

StackOverflow https://stackoverflow.com/questions/2112350

Вопрос

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

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

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

Итак, мой приемник функций активирует эту функцию определения списка, имея 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.Список шаблонов 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["Пользовательский список доступа"]; найден.

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

Это было полезно?

Решение

Эндрю,

Проблема связана с внутренними асинхронными событиями и временем выполнения действия.Как вы говорите, если вы уходите и возвращаетесь, это работает, т. е.асинхронное событие завершено.Вы обрабатываете FeatureCollection.Добавить в качестве метода synchronus.

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

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

Эндрю

Другие советы

Вам нужно вызвать EnsureListsData в SPListCollection, который вы только что обновили.

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

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

        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();
                }
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top