comment puis-je ajouter récepteur d'événements uniquement pour la liste avec l'identifiant de modèle spécifique
-
26-09-2019 - |
Question
J'ajoute le récepteur d'événements ItemAdding pour le modèle de liste personnalisée. Les deux récepteur d'événements et le modèle de liste sont déployés par la même fonction. Aussi la même fonction crée des instances de la liste.
Le problème que j'ai est que l'événement est a tiré pour chaque élément de la liste dans le site auquel il a été déployé. Elements.xml pour eventreceivre est:
<Receivers ListTemplateId="10200">
<Receiver>
<Name>ListEventReceiverItemAdding</Name>
<Type>ItemAdding</Type>
<Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
<Class>SharepoitProject.ListEventReceiver</Class>
<SequenceNumber>10000</SequenceNumber>
</Receiver>
</Receivers>
Je ne sais pas ce que je fais mal, je l'ai fait plus ou moins everythin ici .
Env: 2010 Sharepoint avec la publication Feature sur ce site
La solution
J'ai eu le même problème avec mon récepteur d'événements. J'ai essayé ListTemplateId, ListTemplateOwner, et même ListUrl. Je savais que les paramètres étaient valides, mais ils ont été ignorés et le récepteur était d'être attaché à chaque liste.
J'ai eu le pressentiment qu'il pourrait être lié au récepteur de l'événement étant déclaré dans un scope fonction du site. Cela semble être confirmé par le "documentation" SPEventElement:
switch (this.FeatureDefinition.Scope)
{
case SPFeatureScope.Site:
if (this.SiteScopedReceivers())
{
this.UpdateEventReceiversForSite(site, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForSite(this.GetEventReceivers(site.RootWeb).GetSqlToAddEventReceiversToSite));
break;
}
else
{
this.UpdateEventReceiversForWeb(site.RootWeb, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForWeb(this.GetEventReceivers(site.RootWeb).GetSqlToAddEventReceiversToWeb));
break;
}
case SPFeatureScope.Web:
if (this.RootWebOnly && !web.IsRootWeb)
{
ULS.SendTraceTag(1718513714U, (ULSCatBase) ULSCat.msoulscat_WSS_General, ULSTraceLevel.Verbose, "Event Receivers in Feature '{0}' were not activated because current web is not the root web.", new object[1]
{
(object) this.FeatureDefinition.Id.ToString("B")
});
break;
}
else
{
bool templateIdExists;
int templateId;
this.CheckTemplateId(out templateIdExists, out templateId);
if (!templateIdExists)
{
if (this.ListUrl != null)
{
this.UpdateEventReceiversForList(web, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForList(this.GetEventReceivers(web).GetSqlToAddEventReceiversToList), true);
break;
}
else
{
this.UpdateEventReceiversForWeb(web, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForWeb(this.GetEventReceivers(web).GetSqlToAddEventReceiversToWeb));
break;
}
}
else
{
if (this.ListUrl != null)
throw new SPException(SPResource.GetString("ElementHasBothTemplateIdAndUrl", new object[0]));
this.UpdateEventReceiversForListTemplate(templateId, web, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForList(this.GetEventReceivers(web).GetSqlToAddEventReceiversToList));
break;
}
}
}
Il semble que ListTemplateId, ListTemplateOwner et ListUrl sont ignorés pour les fonctionnalités étendues du site. Lorsque je me suis déplacé mon élément récepteur d'événements à une fonction scope Web, le récepteur a été correctement fixé uniquement à la liste désirée.
Autres conseils
Quand scope sur le site il a tiré pour toutes les listes. Quand je scoped la solution à Web il a travaillé. Espérons que cela aide.
Dans le MSDN SDK - http://msdn.microsoft.com/en -nous / bibliothèque / ms431081.aspx
Une balise récepteurs peut impliquer un ensemble du site l'enregistrement d'événement ou d'un événement inscription pour le Web racine. le Champ d'application de l'attribut est utilisé pour définir au quel niveau les récepteurs d'événements sont appliqué. Si la balise Récepteurs n'a pas ListTemplateId ou attribut ListUrl, le récepteur d'événements est enregistré à la même portée que la fonction. Pour par exemple, une fonctionnalité qui est scope à les Résultats sur le Web dans un récepteur d'événements étant ajoutée à un récepteur d'événements collection qui est portée a été définie sur le Web.
Cela me conduit à croire que la liste templateId que vous avez fourni peut être invalide.
Si vous avez besoin trop la portée du récepteur d'événements pour une liste spécifique que vous devez définir cet attribut et il fonctionnera ISA mais assurez-vous que votre fonction est web scope pas le site scope comme si elle est portée de site, il se déclenche pour toutes les listes dans le système