2010-03-17 37 views
2

我爲維基頁面庫創建了新的內容類型。我通過代碼將這種內容類型添加到庫中(該接口不允許這樣做)。接下來,我爲此內容類型添加了一個事件接收器(在ItemAdded和ItemAdding上)。我的問題是,沒有事件被改變。 如果我將這些事件直接添加到維基頁面庫,所有工作正常。 是否有限制/錯誤/技巧?內容類型上的事件接收器未在WikiPageLibrary上觸發

我看着連接到與SharePoint經理,在他的架構事件接收器的部分缺失庫中的內容類型......我知道,應該是這樣的:

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

如果我期待使用SPM添加到網站的內容類型我將這部分視爲模式。

這裏是我的代碼:

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!

回答

5

我不確定,但是可以在將內容類型添加到列表之前嘗試將事件接收器添加到內容類型。

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

+0

工作!大thx! –

相關問題