Mise à niveau des fonctionnalités, nouveau récepteur d'objets
-
09-12-2019 - |
Question
J'ai besoin de créer un événement de mise à jour d'articles pour une liste existante dans une solution existante que je viens de vérifier et il y a déjà une fonctionnalité pour cela, la question ici est pour ce type de mise à niveau dois-je créer une mise à niveau des fonctionnalités?
Ou seulement la mise à jour de la solution + la création du code feront l'affaire ?
La solution
Vous devez utiliser la mise à niveau des fonctionnalités pour enregistrer le nouveau EventReceiver.
La simple création du code ne dira pas à SharePoint d'appeler EventReceiver, vous devez le faire dans un fichier Elements.xml en utilisant <Receivers>
élément ou via le code en créant un nouvel élément dans la bonne collection EventReceivers
Pour les exemples suivants, supposons que vous effectuez une mise à niveau vers la version 7.0.0.0.
CAML
Pour ajouter le récepteur d'événements dans CAML, votre feature.xml devrait ressembler à ceci :
<?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>
Avec le nouveau Elements.xml appliqué à la fois lors de la mise à niveau et lors des nouvelles activations
Code
Pour ajouter le récepteur d'événements dans le code, votre feature.xml devrait ressembler à ceci :
<?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>
Et dans FeatureReceiver, vous aurez un code comme :
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;
...
}
Avec le code d'ajout de EventReceiver exécuté lors de la mise à niveau avec ActionName = "AddNewEventReceiver" ainsi que sur les nouvelles activations.Et bien sûr, en le supprimant lors de la désactivation.
Pour ajouter un eventReceiver dans le code, utilisez quelque chose comme :
parentWeb.Lists[_listName].EventReceivers.Add(_eventType, Assembly.GetExecutingAssembly().FullName, _eventReceiverClassName);
Autres conseils
FeatureUpgrading est tiré lorsqu'une fonctionnalité pénètre dans l'état de mise à niveau, ce qui n'est déclenché que si la fonctionnalité est due pour la mise à niveau (c'est-à-dire: la version installée est supérieure à celle de la version activée).
Avez-vous lu la série de blogs de Chris O'Brien sur la mise à niveau des fonctionnalités afin de mieux comprendre le fonctionnement de la mise à niveau de la fonctionnalité: http://www.sharepoindnutsandbolts.com/2010/06/freature-upgrade-par-1-fundamentals.html