2013-03-12 102 views
0

我創建了一些網站欄/一個內容類型和一個列表定義作爲功能的一部分。我想附加一個eventreceiver到內容類型。我添加了代碼以將事件接收器附加到內容類型。使用spmanager我可以看到事件接收器被附加到內容類型,但是當我從內容類型創建列表時,事件接收器丟失。有任何想法嗎。我的代碼如下附加一個事件接收器到一個內容類型

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); 
        } 
       }  
      } 

回答

0

我正在使用這個成功。我留在我的日誌記錄和日誌記錄方法。

/// <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

我不知道是這關係到你的問題或沒有,但

,但你可以嘗試將事件接收器添加到內容類型添加的內容類型列表之前。

我認爲之前必須添加事件接收器,因爲當向列表添加內容類型時,內容類型不會直接添加到列表中,而是將其副本添加到列表中。所以當你將你的內容類型添加到列表中時,還沒有事件接收器。

糾正我,如果我明白你的問題是錯的?

謝謝

相關問題