Example #1
0
 internal SPModelEventArgs(SPModelEventType eventType, SPModel model, ISPListItemAdapter previousAdapter, SPItemEventProperties properties)
 {
     CommonHelper.ConfirmNotNull(model, "model");
     CommonHelper.ConfirmNotNull(properties, "properties");
     this.properties      = properties;
     this.previousAdapter = previousAdapter;
     this.manager         = model.ParentCollection.Manager;
     this.eventType       = eventType;
 }
Example #2
0
        protected void HandleEvent(SPItemEventProperties properties, SPModelEventType eventType)
        {
            using (new SPMonitoredScope(String.Format("SPModel Event Receiver ({0})", eventType))) {
                try {
                    if (properties.AfterProperties != null && properties.BeforeProperties != null)
                    {
                        SPListItemCollection itemData = Interlocked.Exchange(ref previousItemData, null);
                        ISPListItemAdapter   adapter;
                        ISPListItemAdapter   previousAdapter;
                        if (eventType == SPModelEventType.Deleted)
                        {
                            adapter         = new SPPreviousEventDataCollectionAdapter(properties, itemData);
                            previousAdapter = adapter;
                        }
                        else if (eventType == SPModelEventType.Adding || eventType == SPModelEventType.Updating || eventType == SPModelEventType.Deleting || eventType == SPModelEventType.Publishing)
                        {
                            adapter         = new SPItemEventDataCollectionAdapter(properties);
                            previousAdapter = eventType == SPModelEventType.Adding ? null : new SPListItemAdapter(properties.ListItem);
                        }
                        else
                        {
                            adapter         = new SPListItemAdapter(properties.ListItem);
                            previousAdapter = itemData != null ? new SPPreviousEventDataCollectionAdapter(properties, itemData) : adapter;
                        }

                        SPModel currentItem = SPModel.TryCreate(adapter);
                        if (currentItem != null)
                        {
                            currentItem.HandleEvent(new SPModelEventArgs(eventType, currentItem, previousAdapter, properties));
                            if (eventType == SPModelEventType.Updating || eventType == SPModelEventType.Deleting)
                            {
                                previousItemData = properties.ListItem.ListItems;
                            }
                        }
                    }
                } catch (Exception ex) {
                    SPDiagnosticsService.Local.WriteTrace(TraceCategory.General, ex);
                    if (HostingEnvironment.IsHosted)
                    {
                        properties.Status       = SPEventReceiverStatus.CancelWithError;
                        properties.ErrorMessage = ex.Message;
                    }
                    else
                    {
                        throw;
                    }
                }
            }
        }