Я уже шестой час борюсь с тем, что, надеюсь, должно иметь простое решение, поэтому я подумал, что опубликую здесь.
У меня есть функция с приемником функций, единственная цель которой - активировать развернутую функцию определения списка, а затем создать экземпляр этого нового определения списка.
Функция определения списка, называемая «Пользовательский список доступа», работает в сети.
Итак, мой приемник функций активирует эту функцию определения списка, имея 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"];.
Но я бы предпочел, чтобы первый подход работал - активировать в моем коде приемника функцию определения списка, а затем найти ее, чтобы затем можно было создать экземпляр списка.