Обновление функций, новый приемник предметов
-
09-12-2019 - |
Вопрос
Мне нужно создать событие обновления элемента для существующего списка в существующем решении Я только что проверил, и для этого уже есть функция, вопрос здесь в том, нужно ли для этого типа обновления создавать обновление функции?
Или только обновление решения + создание кода сделают свое дело?
Решение
Вы должны использовать Обновление функции для регистрации нового EventReceiver.
Простое создание кода не заставит SharePoint вызывать EventReceiver вы должны сделать это в любом Elements.xml файле, используя <Receivers>
элемент или с помощью кода путем создания нового элемента в нужной коллекции EventReceivers
В следующих примерах предположим, что вы обновляетесь до версии 7.0.0.0.
CAML
Чтобы добавить приемник событий в CAML, ваш feature.xml должен быть чем-то вроде:
<?xml version="1.0" encoding="utf-8" ?>
<Feature ... Version="7.0.0.0">
<UpgradeActions>
<VersionRange BeginVersion="0.0.0.0" EndVersion="7.0.0.0">
<ApplyElementManifests>
<ElementManifest Location="MyNewEventReceiver\Elements.xml" />
</ApplyElementManifests>
</VersionRange>
<UpgradeActions>
...
<ElementManifest Location="MyNewEventReceiver\Elements.xml" />
</Feature>
При этом новый параметр Elements.xml применяется как при обновлении, так и при новых активациях
Код
Чтобы добавить приемник событий в код, ваш feature.xml должен быть чем-то вроде:
<?xml version="1.0" encoding="utf-8" ?>
<Feature ... ReceiverAssembly="XXX" ReceiverClass="YYY" Version="7.0.0.0">
<UpgradeActions>
<VersionRange BeginVersion="0.0.0.0" EndVersion="7.0.0.0">
<CustomUpgradeAction Name="AddNewEventReceiver" />
</VersionRange>
<UpgradeActions>
...
</Feature>
И в FeatureReceiver у вас будет код типа:
public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
{
SPWeb parentWeb = (SPWeb)properties.Feature.Parent;
switch (upgradeActionName)
{
case "AddNewEventReceiver":
// Add EventReceiver;
break;
...
}
}
public override virtual void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb parentWeb = (SPWeb)properties.Feature.Parent;
...
// Add EventReceiver;
...
}
public override virtual void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPWeb parentWeb = (SPWeb)properties.Feature.Parent;
...
// Remove EventReceiver;
...
}
При этом код для добавления EventReceiver запускается при обновлении с ActionName = "AddNewEventReceiver", а также при новых активациях.И, конечно же, удаление его при деактивации.
Чтобы добавить EventReceiver в код, используйте что-то вроде:
parentWeb.Lists[_listName].EventReceivers.Add(_eventType, Assembly.GetExecutingAssembly().FullName, _eventReceiverClassName);
Другие советы
Функция обновления уволена, когда функция входит в состояние обновления, и это срабатывает только в том случае, если функция должна обновляться (т. Е. Установленная версия больше, чем у активированной версии).
Прочитайте через серию блога блога Криса О'Брайена о обновлении функции, чтобы получить больше понимания, как работает обновление функций: http://www.sharepointnutsandbolts.com/2010/06/feature-upgrade-part--fundamentals.html