Я уже шестой час сражаюсь с тем, что, как я надеюсь, должно иметь простое решение, поэтому я подумал, что опубликую здесь.
У меня есть функция с получателем функций, единственной целью которой является активация развернутой функции определения списка, а затем создание экземпляра этого нового определения списка.
Функция определения списка, называемая «Список настраиваемого доступа», доступна в Интернете.
Таким образом, мой приемник функций активирует эту функцию определения списка, имея 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 refresh ". Тогда это видно.
Я что-то здесь упускаю? Вызов web.Update () здесь:
try
{
SPFeatureCollection featureCollection = web.Features;
featureCollection.Add(new Guid(featureGUID), true); // true to force activation
web.Update();
}
...
ничего не делает. Есть ли какой-нибудь способ, которым я могу «обновить» объект SPWeb, чтобы новый шаблон списка можно было увидеть и использовать?
Обходной путь, который я нашел на данный момент, заключается в добавлении функции шаблона списка «Список настраиваемого доступа» в качестве зависимости активации в самом приемнике функции «родительского элемента» и в скрытии функции шаблона списка «Список настраиваемого доступа». , Таким образом, насколько мне известно, функция определения настраиваемого списка принудительно активируется, и я обнаружил, что web.ListTemplates ["Список настраиваемого доступа"]; найдено.
Но я бы предпочел прежний подход - активировать в коде моего получателя функцию определения списка, а затем найти ее, чтобы затем можно было создать экземпляр списка.