2013-03-12 4 views
0

J'ai créé des colonnes de site/un type de contenu et une définition de liste dans le cadre d'une entité. Je veux attacher un Eventreceiver au type de contenu. J'ai ajouté du code pour attacher le récepteur d'événements au type de contenu. En utilisant spmanager, je peux voir que le récepteur d'événements est attaché au type de contenu mais quand je crée des listes à partir du type de contenu, le récepteur d'événements est manquant. Des idées. Mon code est ci-dessousAssociation d'un récepteur d'événements à un type de contenu

public override void FeatureActivated(SPFeatureReceiverProperties properties) 
      { 
       string asmName = System.Reflection.Assembly.GetExecutingAssembly().FullName; 
       string itemReceiverName = "xxxxxx.Intranet.SP.xxxxx.PermissionsUpdaterEventReceiver"; 

       ////surely a better way to get all lists than this 
       ////re - do 
       using (SPSite thisSite = (SPSite)properties.Feature.Parent) { 
        using (SPWeb web = thisSite.RootWeb) { 
         SPContentType RambollNewsContentType = web.ContentTypes["RambollNewsContentType"]; 
         RambollNewsContentType.EventReceivers.Add(SPEventReceiverType.ItemAdded, asmName, itemReceiverName); 
         RambollNewsContentType.Update(true); 
        } 
       }  
      } 

Répondre

0

J'utilise ceci avec succès. Je suis parti dans ma notation et la méthode d'enregistrement.

/// <summary> 
    /// This method is executed on feature activation. 
    /// It attaches the event receiver to the content type. 
    /// </summary> 
    public override void FeatureActivated(SPFeatureReceiverProperties properties) 
    { 
     LogMessage("FeatureActivated - Start"); 
     SPSite site = (SPSite)properties.Feature.Parent; 
     LogMessage("FeatureActivated - 1"); 
     SPWeb web = site.RootWeb; 
     LogMessage("FeatureActivated - 2"); 
     //ListContentTypes(web); 
     SPContentType ctype = web.ContentTypes["Wells Project Task List"]; 
     LogMessage("FeatureActivated - 3"); 
     LogMessage("ctype name: " + ctype.Name.ToString()); 
     if (ctype != null) 
     { 
      LogMessage("FeatureActivated - I have a content type. Web url: " + web.Url); 
      SPEventReceiverDefinition er = ctype.EventReceivers.Add(); 
      er.Class = "Wells.SharePoint.ProjectManagementEventReceiver"; 
      er.Assembly = "ProjectManagementEventReceiver, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a1cb21c41d80b7ae"; 
      er.Type = SPEventReceiverType.ItemAdded; 
      er.Name = "ItemAdded"; 
      er.SequenceNumber = 10001; 
      er.Update(); 
      ctype.Update(false); 
      LogMessage("FeatureActivated - After ctype.update"); 
      web.Dispose(); 
     } 
     else 
      LogMessage("CT not found: " + web.Url); 




     LogMessage("FeatureActivated - End"); 
    } 

    static void ListContentTypes(SPWeb web) 
    { 
     foreach (SPContentType ct in web.ContentTypes) 
     { 
      LogMessage("CT: " + ct.Name.ToString()); 
     } 
    } 


    /// <summary> 
    /// This method is executed on feature deactivation. 
    /// It removes the event receiver from the content type 
    /// </summary> 
    /// <param name="properties"></param> 
    public override void FeatureDeactivating(SPFeatureReceiverProperties properties) 
    { 
     LogMessage("Feature DeActivated - Start"); 
     SPSite site = (SPSite)properties.Feature.Parent; 
     SPWeb web = site.OpenWeb(); 
     SPContentType contentType = web.ContentTypes["NAME OF CONTENT TYPE"]; 
     if (contentType != null) 
     { 
      LogMessage("im have a content type. Web url: " + web.Url); 
      int i; 
      //Use the above integer to loop through the event recievers on the first list and delete the above assembly 
      for (i = 0; i < contentType.EventReceivers.Count; i++) 
      { 
       LogMessage("ER Count: " + contentType.EventReceivers.Count); 
       if (contentType.EventReceivers[i].Assembly.Contains("ProjectManagementEventReceiver")) 
       { 
        contentType.EventReceivers[i].Delete(); 

        LogMessage("Deleting event receiver from CT"); 


       } 
      } 
      contentType.Update(); 
     } 
     else 
      LogMessage("CT not found: " + web.Url); 

     LogMessage("Feature DeActivated - End"); 

    } 

static void LogMessage(string msg) 
    { 
     StreamWriter wrtr = null; 
     try 
     { 
      wrtr = new StreamWriter("C:\\Logs\\FeatureActivatedDeactivated.txt", true); 
      wrtr.WriteLine(msg + "--[" + System.DateTime.Now.ToString() + "]" + Environment.NewLine); 
      wrtr.WriteLine(Environment.NewLine + "=================================="); 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      if (wrtr != null) 
      { 
       wrtr.Close(); 
       wrtr.Dispose(); 
      } 
     } 
    } 
0

Je ne sais pas est-ce lié à votre question ou non, mais

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é auparavant car lorsque vous ajoutez un type de contenu à une liste, le type de contenu n'est pas ajouté directement à la liste, mais une copie est ajoutée à la liste. Ainsi, lorsque vous ajoutez votre type de contenu à la liste, il n'y a pas encore de récepteur d'événements. Corrigez-moi si j'ai une mauvaise compréhension de votre question?

Merci

Questions connexes