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