Ho un tipo di contenuto del sito che è stato utilizzato per una manciata di elenchi in tutta la mia raccolta siti. In quel tipo di contenuto, descrivo un ricevitore di eventi per gestire l'evento ItemAdding. Funziona bene Ora ho bisogno di aggiornare il tipo di contenuto in modo che anche ItemUpdating sia gestito. OTTOMH, ho provato semplicemente a modificare l'xml per il mio tipo di contenuto, dal momento che questo sembrava consentire un facile monitoraggio delle versioni. Ciò ha funzionato nel senso che i miei aggiornamenti venivano applicati al tipo di contenuto del sito, ma non ai miei elenchi che utilizzavano questo tipo di contenuto. Questo era previsto. Poi ho notato che la SharePoint SDK prende un grim view di che:Aggiornamento dei tipi di contenuto SharePoint già distribuiti per gestire eventi aggiuntivi degli articoli
In nessun caso si aggiornare il file di definizione del tipo di contenuto per un tipo di contenuto dopo aver installato e attivato che il contenuto tipo. Windows SharePoint Services fa sì che non tenga traccia delle modifiche apportate al file di definizione del tipo di contenuto . Pertanto, si non è disponibile alcun metodo per annullare le modifiche apportate ai tipi di contenuto del sito su i tipi di contenuto figlio.
L'SDK quindi punta a un paio di sezioni che descrivono come utilizzare l'interfaccia utente o il codice per apportare modifiche. Dal momento che l'interfaccia utente non offre hook in destinatari di eventi, suppongo che sceglierò il percorso del codice.
ho pensato che sarei in grado di fare qualcosa del genere e basta aggiungere un nuovo ricevitore evento alla copia della lista del tipo di contenuto:
SPList list = web.Lists["My list"];
SPContentType ctype = list.ContentTypes["My content type"];
// Doesn't work -- EventReceivers is null below.
ctype.EventReceivers.Add(SPEventReceiverType.ItemUpdating,
"My assembly name", "My class name");
Ma il problema è che ctype.EventReceivers è nullo qui , anche se ho già aggiunto ItemAdding a questo elenco. Sembra che sia stato spostato nella lista stessa. Quindi, la lista ha una collezione EventReceivers valida.
SPList list = web.Lists["My list"];
list.EventReceivers.Add(SPEventReceiverType.ItemUpdating,
"My assembly name", "My class name");
Così, ho un paio di domande:
- è il modo corretto per fare questo solo per aggiungere eventuali nuovi ricevitori di eventi direttamente alla lista e solo dimenticare tipo completamente i miei contenuti?
- Per eseguire questa modifica, qual è il modo migliore per gestirlo in termini di gestione della configurazione? Devo creare una semplice app per console per trovare tutti gli elenchi appropriati e modificarli? O è in qualche modo la creazione di una caratteristica un'opzione migliore? In entrambi i casi, sembra che questo cambiamento si svolgerà da solo e difficile da scoprire da parte degli sviluppatori futuri che potrebbero dover lavorare con questo tipo di contenuto.
Buona domanda: ho intenzione di chiedere qualcosa di simile. –