Récepteur de l'événement sur le contenu Type non déclenché sur WikiPageLibrary
-
20-09-2019 - |
Question
J'ai créé un nouveau type de contenu pour une bibliothèque de pages wiki. J'ai ajouté ce type de contenu à la bibliothèque par code (l'interface n'a pas permis à ce sujet). Ensuite, j'ai ajouté un récepteur d'événement pour ce type de contenu (sur ItemAdded et ItemAdding). Mon problème est qu'aucun événement est trrigered. Si j'ajoute cet événement directement à la bibliothèque wiki tout fonctionne très bien. Y at-il une limitation / bug / astuce?
Je regardais le type de contenu attaché à la bibliothèque SharePoint Manager et dans son schéma pour la partie récepteur d'événements manque ... Je sais qu'il devrait y avoir quelque chose comme:
<XmlDocuments>
<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/events">
<spe:Receivers xmlns:spe="http://schemas.microsoft.com/sharepoint/events">
<Receiver>
<Name>
</Name>
<Type>1</Type>
<SequenceNumber>10000</SequenceNumber>
<Assembly>RssFeedWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6722cbeba696def</Assembly>
<Class>RssFeedWP.ItemEventReceiver</Class>
<Data>
</Data>
<Filter>
</Filter>
</Receiver>
<Receiver>
<Name>
</Name>
<Type>10001</Type>
<SequenceNumber>10000</SequenceNumber>
<Assembly>RssFeedWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6722cbeba696def</Assembly>
<Class>RssFeedWP.ItemEventReceiver</Class>
<Data>
</Data>
<Filter>
</Filter>
</Receiver>
</spe:Receivers>
</XmlDocument>
Si je regarde avec SPM au type de contenu ajouté au site que je vois cette partie dans le schéma.
Voici mon code:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
using (SPWeb web = (SPWeb)properties.Feature.Parent)
{
// create RssWiki content type
SPContentType rssFeedContentType = new SPContentType(web.AvailableContentTypes["Wiki Page"],
web.ContentTypes, "RssFeed Wiki Page");
// add rssfeed url field to the new content type
AddFieldToContentType(web, rssFeedContentType, "RssFeed Url", SPFieldType.Note);
// add use xslt check box field to the new content type
AddFieldToContentType(web, rssFeedContentType, "Use Xslt", SPFieldType.Boolean);
// add xslt url field to the new content type
AddFieldToContentType(web, rssFeedContentType, "Xslt Url", SPFieldType.Note);
web.ContentTypes.Add(rssFeedContentType);
rssFeedContentType.Update();
web.Update();
AddContentTypeToList(web, rssFeedContentType);
AddEventReceiversToCT(rssFeedContentType);
//AddEventReceiverToList(web);
}
}
private void AddFieldToContentType(SPWeb web, SPContentType ct, string fieldName, SPFieldType fieldType)
{
SPField rssUrlField = null;
try
{
rssUrlField = web.Fields.GetField(fieldName);
}
catch (Exception ex)
{
if (rssUrlField == null)
{
web.Fields.Add(fieldName, fieldType, false);
}
}
SPFieldLink rssUrlFieldLink = new SPFieldLink(web.Fields[fieldName]);
ct.FieldLinks.Add(rssUrlFieldLink);
}
private static void AddContentTypeToList(SPWeb web, SPContentType ct)
{
SPList wikiList = web.Lists[listName];
wikiList.ContentTypesEnabled = true;
wikiList.ContentTypes.Add(ct);
wikiList.Update();
}
private static void AddEventReceiversToCT(SPContentType ct)
{
//add event receivers
string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().FullName;
string ctReceiverName = "RssFeedWP.ItemEventReceiver";
ct.EventReceivers.Add(SPEventReceiverType.ItemAdding, assemblyName, ctReceiverName);
ct.EventReceivers.Add(SPEventReceiverType.ItemAdded, assemblyName, ctReceiverName);
ct.Update();
}
Thx!
La solution
Je ne suis pas sûr, mais pourriez-vous essayer d'ajouter le récepteur d'événements du type de contenu avant d'ajouter le type de contenu à la liste.
Je pense que le récepteur d'événements doit être ajouté avant que lors de l'ajout d'un type de contenu à une liste type de contenu n'est pas directement ajouté à la liste, plutôt une copie de celui-ci est ajouté à la liste. Donc, lorsque vous ajoutez votre type de contenu à la liste, il n'y a pas encore de récepteur d'événements.