У меня есть тип контента сайта, который использовался для нескольких списков в моем семействе сайтов. В этом типе контента я описываю приемник событий для обработки события ItemAdding. Это прекрасно работает. Теперь мне нужно обновить тип контента, чтобы также обрабатывать ItemUpdating. Я попытался просто изменить xml для своего типа контента, так как это, казалось, позволяло легко отслеживать версии. Это сработало в том смысле, что мои обновления были применены к типу контента сайта, но не к моим спискам, которые использовали этот тип контента. Этого и ждали. Затем я заметил, что SharePoint SDK принимает мрачный взгляд на это:
Ни при каких обстоятельствах вы не должны обновлять файл определения типа контента для типа контента после того, как вы установили и активировали этот тип контента. Windows SharePoint Services не отслеживает изменения, внесенные в файл определения типа контента. Следовательно, у вас нет метода для передачи изменений, внесенных в типы контента сайта, в дочерние типы контента.
Затем SDK указывает на пару разделов, в которых описывается, как использовать пользовательский интерфейс или код для внесения изменений. Поскольку пользовательский интерфейс не поддерживает приемники событий, я думаю, что выберу кодовый путь.
Я думал, что смогу сделать что-то подобное и просто добавить новый приемник событий в копию списка типа контента:
SPList list = web.Lists["My list"];
SPContentType ctype = list.ContentTypes["My content type"];
// Doesn't work -- EventReceivers is null below.
ctype.EventReceivers.Add(SPEventReceiverType.ItemUpdating,
"My assembly name", "My class name");
Но загвоздка в том, что ctype.EventReceivers здесь имеет значение null, хотя у меня уже есть ItemAdding, подключенный к этому списку. Судя по всему, он был перемещен в сам список. Итак, в списке есть действительная коллекция EventReceivers.
SPList list = web.Lists["My list"];
list.EventReceivers.Add(SPEventReceiverType.ItemUpdating,
"My assembly name", "My class name");
Итак, у меня есть пара вопросов:
- Правильный ли способ сделать это - просто добавить новых приемников событий прямо в список и вообще забыть о моем типе контента?
- Как лучше всего справиться с этим с точки зрения управления конфигурацией, чтобы выполнить это изменение? Должен ли я создать простое консольное приложение, чтобы найти все подходящие списки и изменить каждый из них? Или каким-то образом создание функции - лучший вариант? В любом случае, похоже, что это изменение произойдет само по себе, и его трудно обнаружить будущим разработчикам, которым, возможно, потребуется работать с этим типом контента.