Мой приемник функций SharePoint активирует функцию определения списка, но мой код не может видеть шаблон списка до "второго прохода"
Я на шестом часу сражаюсь с тем, что, как мы надеемся, должно иметь простое решение, поэтому я решил опубликовать здесь.
У меня есть функция с приемником функций, единственной целью которой является активация развернутой функции определения списка, а затем создание экземпляра этого нового определения списка.
Функция определения списка, называемая "Custom Access List", доступна в Интернете.
Поэтому мой приемник функций активирует эту функцию определения списка, имея 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 ["Список настраиваемого доступа"]; найден.
Но я бы предпочел, чтобы первый подход работал - активировать в моем коде получателя функцию определения списка, а затем найти ее, чтобы затем можно было создать экземпляр списка.
3 ответа
Эндрю,
Проблема заключается в внутренних асинхронных событиях и времени выполнения операции. Как вы говорите, если вы уходите и возвращаетесь, это работает - то есть событие асинхронности завершено. Вы рассматриваете featureCollection.Add как метод синхронизации.
Что вам действительно следует делать, если вам нужен шаблон и экземпляр списка, созданный одновременно, для этого используется XML-инфраструктура.
Добавьте к вашей функции, имеющей шаблон списка, или альтернативно добавьте новую функцию для экземпляра списка и укажите 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();
}
}
}