Копирование элементов списка из основного списка на подузлы

У меня есть сайт, который содержит пользовательский список Мастер. У меня есть несколько сайтов, которые содержат копии этого списка. Когда кто-то редактирует или добавляет новый элемент списка в основной список, я бы хотел, чтобы все дочерние сайты соответствующим образом обновлялись обработчиком событий, который связан с основным списком.

например, если элемент добавлен, добавьте его в список каждого подузла

если элемент обновлен, обновите соответствующий элемент списка каждого подузла

если элемент удален, удалите соответствующий элемент списка с каждого подузла

Я пытался использовать метод SPListItem.Copy, а также метод CopyTo listItem безрезультатно. Какова лучшая практика выполнения этой техники?

2 ответа

Решение

Я считаю, что SPListItem.Copy и SPListItem.CopyTo будут работать только в том случае, если целевой список находится на том же SPWeb, что и исходный элемент. Я предполагаю, что эти элементы списка имеют некоторое поле "идентичность", которое не только отличает его от других элементов списка, но также всегда одинаково для всех дочерних сайтов и сайта верхнего уровня (в отличие от идентификатора, который не равен 100). % под вашим контролем). Может быть заголовком, может быть программно назначенным номером, может быть чем угодно. Я просто назову это поле "личность".

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

Удаление - это самая простая вещь, с которой нужно справиться. Просто выполните итерацию по дочерним сайтам, выполните итерацию по основному списку для элемента с правильным полем "identity" и вызовите SPListItem.Delete() для него. Этого должно быть достаточно, чтобы добавить событие ItemDeleting.

Добавление немного сложнее. Еще раз переберите дочерние сайты, но на этот раз используйте метод, подобный следующему

SPListItem target = list.Items.Add();
target["Title"] = properties.AfterProperties["Title"];
//Repeat similar assignments for all fields in the list item which can be assigned during creation.
target.Update();

Это нужно будет изменить, чтобы включить каждое поле, которое можно изменить, а также поле "идентификатор", если вы его еще не включили. Вам не нужно беспокоиться о том, что будет назначено автоматически (SharePoint все равно будет их обрабатывать, если сработает Copy/CopyTo). Поместите это в событие ItemAdded.

Наконец, обновление элемента очень похоже на добавление элемента, только вместо того, чтобы вызывать list.Items.Add(), вместо этого вы получаете правильный элемент, перебирая основной список и получая элемент с правильным полем "identity". Поместите его в событие ItemUpdated.

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

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

Другие вопросы по тегам