2013-03-12 4 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

Я не уверен, что это связано с вашим вопросом или нет, но

но вы могли бы попробовать добавить приемник событий к типу контента, прежде чем добавить тип содержимого в список ,

Я думаю, что приемник событий должен быть добавлен раньше, потому что при добавлении типа содержимого в список тип контента не добавляется непосредственно в список, скорее его копия добавляется в список. Поэтому, когда вы добавляете свой тип контента в список, пока нет приемника событий.

Исправить меня, если я понимаю ваш вопрос неправильно?

спасибо

Смежные вопросы