diff --git a/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs b/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs
new file mode 100644
index 0000000000..b4efcca229
--- /dev/null
+++ b/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Security.Permissions;
+using Umbraco.Core.Models;
+using Umbraco.Core.Models.EntityBase;
+
+namespace Umbraco.Core.Events
+{
+ ///
+ /// Event args for a strongly typed object that can support cancellation
+ ///
+ ///
+ [HostProtection(SecurityAction.LinkDemand, SharedState = true)]
+ public class CancellableObjectEventArgs : EventArgs, ICancellableObjectEventArgs
+ {
+ private bool _cancel;
+
+ public CancellableObjectEventArgs(T entity, bool canCancel)
+ {
+ Entity = entity;
+ CanCancel = canCancel;
+ }
+
+ public CancellableObjectEventArgs(T entity)
+ : this(entity, true)
+ {
+ }
+
+ ///
+ /// Flag to determine if this instance will support being cancellable
+ ///
+ public bool CanCancel { get; set; }
+
+ ///
+ /// If this instance supports cancellation, this gets/sets the cancel value
+ ///
+ public bool Cancel
+ {
+ get
+ {
+ if (!CanCancel)
+ {
+ throw new InvalidOperationException("This event argument class does not support cancelling.");
+ }
+ return _cancel;
+ }
+ set
+ {
+ if (!CanCancel)
+ {
+ throw new InvalidOperationException("This event argument class does not support cancelling.");
+ }
+ _cancel = value;
+ }
+ }
+
+ public T Entity { get; private set; }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Events/EventExtensions.cs b/src/Umbraco.Core/Events/EventExtensions.cs
new file mode 100644
index 0000000000..1914c411be
--- /dev/null
+++ b/src/Umbraco.Core/Events/EventExtensions.cs
@@ -0,0 +1,49 @@
+using System;
+
+namespace Umbraco.Core.Events
+{
+ ///
+ /// Extension methods for cancellable event operations
+ ///
+ public static class EventExtensions
+ {
+ ///
+ /// Raises the event and returns a boolean value indicating if the event was cancelled
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static bool IsRaisedEventCancelled(
+ this TypedEventHandler eventHandler,
+ TArgs args,
+ TSender sender)
+ where TArgs : ICancellableObjectEventArgs
+ {
+ if (eventHandler != null)
+ eventHandler(sender, args);
+
+ return !args.Cancel;
+ }
+
+ ///
+ /// Raises the event
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void RaiseEvent(
+ this TypedEventHandler eventHandler,
+ TArgs args,
+ TSender sender)
+ where TArgs : EventArgs
+ {
+ if (eventHandler != null)
+ eventHandler(sender, args);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Events/ICancellableObjectEventArgs.cs b/src/Umbraco.Core/Events/ICancellableObjectEventArgs.cs
new file mode 100644
index 0000000000..871362d9db
--- /dev/null
+++ b/src/Umbraco.Core/Events/ICancellableObjectEventArgs.cs
@@ -0,0 +1,18 @@
+namespace Umbraco.Core.Events
+{
+ ///
+ /// Interface for EventArgs clases to implement when they support cancelling operations
+ ///
+ public interface ICancellableObjectEventArgs
+ {
+ ///
+ /// If this instance supports cancellation, this gets/sets the cancel value
+ ///
+ bool Cancel { get; set; }
+
+ ///
+ /// Flag to determine if this instance will support being cancellable
+ ///
+ bool CanCancel { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Events/PublishingEventArgs.cs b/src/Umbraco.Core/Events/PublishingEventArgs.cs
index f762695f70..c58e3bac15 100644
--- a/src/Umbraco.Core/Events/PublishingEventArgs.cs
+++ b/src/Umbraco.Core/Events/PublishingEventArgs.cs
@@ -1,17 +1,17 @@
namespace Umbraco.Core.Events
{
- public class PublishingEventArgs : System.ComponentModel.CancelEventArgs
+ public class PublishingEventArgs : System.ComponentModel.CancelEventArgs
{
- public PublishingEventArgs()
- {
- IsAllRepublished = false;
- }
+ public PublishingEventArgs()
+ {
+ IsAllRepublished = false;
+ }
- public PublishingEventArgs(bool isAllPublished)
- {
- IsAllRepublished = isAllPublished;
- }
+ public PublishingEventArgs(bool isAllPublished)
+ {
+ IsAllRepublished = isAllPublished;
+ }
- public bool IsAllRepublished { get; private set; }
- }
+ public bool IsAllRepublished { get; private set; }
+ }
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Events/SaveEventArgs.cs b/src/Umbraco.Core/Events/SaveEventArgs.cs
index c3654586dd..6f3921e12c 100644
--- a/src/Umbraco.Core/Events/SaveEventArgs.cs
+++ b/src/Umbraco.Core/Events/SaveEventArgs.cs
@@ -1,4 +1,15 @@
+using Umbraco.Core.Models.EntityBase;
+
namespace Umbraco.Core.Events
{
- public class SaveEventArgs : System.ComponentModel.CancelEventArgs { }
+ public class SaveEventArgs : CancellableObjectEventArgs
+ {
+ public SaveEventArgs(TEntity entity, bool canCancel) : base(entity, canCancel)
+ {
+ }
+
+ public SaveEventArgs(TEntity entity) : base(entity)
+ {
+ }
+ }
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Events/TypedEventHandler.cs b/src/Umbraco.Core/Events/TypedEventHandler.cs
new file mode 100644
index 0000000000..a8170190d4
--- /dev/null
+++ b/src/Umbraco.Core/Events/TypedEventHandler.cs
@@ -0,0 +1,7 @@
+using System;
+
+namespace Umbraco.Core.Events
+{
+ [Serializable]
+ public delegate void TypedEventHandler(TSender sender, TEventArgs e);
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs
index aa41767e32..619ee13165 100644
--- a/src/Umbraco.Core/Services/ContentService.cs
+++ b/src/Umbraco.Core/Services/ContentService.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
@@ -603,64 +604,56 @@ namespace Umbraco.Core.Services
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateContentRepository(uow))
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(content, e);
+ if (!Saving.IsRaisedEventCancelled(new SaveEventArgs(content), this))
+ return false;
- if (!e.Cancel)
+ //Check if parent is published (although not if its a root node) - if parent isn't published this Content cannot be published
+ if (content.ParentId != -1 && content.ParentId != -20 && HasPublishedVersion(content.ParentId) == false)
{
- //Check if parent is published (although not if its a root node) - if parent isn't published this Content cannot be published
- if (content.ParentId != -1 && content.ParentId != -20 && HasPublishedVersion(content.ParentId) == false)
- {
- LogHelper.Info(
- string.Format(
- "Content '{0}' with Id '{1}' could not be published because its parent is not published.",
- content.Name, content.Id));
- return false;
- }
-
- //Content contains invalid property values and can therefore not be published - fire event?
- if (!content.IsValid())
- {
- LogHelper.Info(
- string.Format(
- "Content '{0}' with Id '{1}' could not be published because of invalid properties.",
- content.Name, content.Id));
- return false;
- }
-
- //Publish and then update the database with new status
- bool published = _publishingStrategy.Publish(content, userId);
-
- //Since this is the Save and Publish method, the content should be saved even though the publish fails or isn't allowed
- SetWriter(content, userId);
- repository.AddOrUpdate(content);
- uow.Commit();
-
- if (published)
- {
- var xml = content.ToXml();
- var poco = new ContentXmlDto { NodeId = content.Id, Xml = xml.ToString(SaveOptions.None) };
- var exists = uow.Database.FirstOrDefault("WHERE nodeId = @Id", new { Id = content.Id }) != null;
- int result = exists
- ? uow.Database.Update(poco)
- : Convert.ToInt32(uow.Database.Insert(poco));
-
- //Save xml to db and call following method to fire event through PublishingStrategy to update cache
- if (omitCacheRefresh == false)
- _publishingStrategy.PublishingFinalized(content);
- }
-
- if (Saved != null)
- Saved(content, e);
-
- Audit.Add(AuditTypes.Publish, "Save and Publish performed by user", userId == -1 ? 0 : userId, content.Id);
-
- return published;
+ LogHelper.Info(
+ string.Format(
+ "Content '{0}' with Id '{1}' could not be published because its parent is not published.",
+ content.Name, content.Id));
+ return false;
}
+ //Content contains invalid property values and can therefore not be published - fire event?
+ if (!content.IsValid())
+ {
+ LogHelper.Info(
+ string.Format(
+ "Content '{0}' with Id '{1}' could not be published because of invalid properties.",
+ content.Name, content.Id));
+ return false;
+ }
- return false;
+ //Publish and then update the database with new status
+ bool published = _publishingStrategy.Publish(content, userId);
+
+ //Since this is the Save and Publish method, the content should be saved even though the publish fails or isn't allowed
+ SetWriter(content, userId);
+ repository.AddOrUpdate(content);
+ uow.Commit();
+
+ if (published)
+ {
+ var xml = content.ToXml();
+ var poco = new ContentXmlDto { NodeId = content.Id, Xml = xml.ToString(SaveOptions.None) };
+ var exists = uow.Database.FirstOrDefault("WHERE nodeId = @Id", new { Id = content.Id }) != null;
+ int result = exists
+ ? uow.Database.Update(poco)
+ : Convert.ToInt32(uow.Database.Insert(poco));
+
+ //Save xml to db and call following method to fire event through PublishingStrategy to update cache
+ if (omitCacheRefresh == false)
+ _publishingStrategy.PublishingFinalized(content);
+ }
+
+ Saved.RaiseEvent(new SaveEventArgs(content, false), this);
+
+ Audit.Add(AuditTypes.Publish, "Save and Publish performed by user", userId == -1 ? 0 : userId, content.Id);
+
+ return published;
}
}
@@ -674,26 +667,21 @@ namespace Umbraco.Core.Services
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateContentRepository(uow))
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(content, e);
+ if (Saving.IsRaisedEventCancelled(new SaveEventArgs(content), this))
+ return;
+
+ SetWriter(content, userId);
- if (!e.Cancel)
- {
- SetWriter(content, userId);
+ //Only change the publish state if the "previous" version was actually published
+ if (content.Published)
+ content.ChangePublishedState(false);
- //Only change the publish state if the "previous" version was actually published
- if (content.Published)
- content.ChangePublishedState(false);
+ repository.AddOrUpdate(content);
+ uow.Commit();
- repository.AddOrUpdate(content);
- uow.Commit();
-
- if (Saved != null)
- Saved(content, e);
-
- Audit.Add(AuditTypes.Save, "Save Content performed by user", userId == -1 ? 0 : userId, content.Id);
- }
+ Saved.RaiseEvent(new SaveEventArgs(content, false), this);
+
+ Audit.Add(AuditTypes.Save, "Save Content performed by user", userId == -1 ? 0 : userId, content.Id);
}
}
@@ -713,44 +701,46 @@ namespace Umbraco.Core.Services
{
var containsNew = contents.Any(x => x.HasIdentity == false);
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(contents, e);
-
- if (!e.Cancel)
+ if (CollectionSaving.IsRaisedEventCancelled(new SaveEventArgs(contents), this))
+ return;
+
+ if (containsNew)
{
- if (containsNew)
+ foreach (var content in contents)
{
- foreach (var content in contents)
- {
- SetWriter(content, userId);
-
- //Only change the publish state if the "previous" version was actually published
- if (content.Published)
- content.ChangePublishedState(false);
+ if (Saving.IsRaisedEventCancelled(new SaveEventArgs(content), this))
+ continue;
+
+ SetWriter(content, userId);
- repository.AddOrUpdate(content);
- uow.Commit();
- }
- }
- else
- {
- foreach (var content in contents)
- {
- if (Saving != null)
- Saving(content, e);
+ //Only change the publish state if the "previous" version was actually published
+ if (content.Published)
+ content.ChangePublishedState(false);
- SetWriter(content, userId);
- repository.AddOrUpdate(content);
- }
+ repository.AddOrUpdate(content);
uow.Commit();
+
+ Saved.RaiseEvent(new SaveEventArgs(content, false), this);
}
-
- if (Saved != null)
- Saved(contents, e);
-
- Audit.Add(AuditTypes.Save, "Bulk Save content performed by user", userId == -1 ? 0 : userId, -1);
}
+ else
+ {
+ foreach (var content in contents)
+ {
+ if (Saving.IsRaisedEventCancelled(new SaveEventArgs(content), this))
+ continue;
+
+ SetWriter(content, userId);
+ repository.AddOrUpdate(content);
+ uow.Commit();
+
+ Saved.RaiseEvent(new SaveEventArgs(content, false), this);
+ }
+ }
+
+ CollectionSaved.RaiseEvent(new SaveEventArgs(contents, false), this);
+
+ Audit.Add(AuditTypes.Save, "Bulk Save content performed by user", userId == -1 ? 0 : userId, -1);
}
}
@@ -767,15 +757,14 @@ namespace Umbraco.Core.Services
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateContentRepository(uow))
- {
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(contents, e);
-
- if (!e.Cancel)
+ {
+ if (!CollectionSaving.IsRaisedEventCancelled(new SaveEventArgs(contents), this))
{
foreach (var content in contents)
{
+ if (Saving.IsRaisedEventCancelled(new SaveEventArgs(content.Value), this))
+ continue;
+
SetWriter(content.Value, userId);
//Only change the publish state if the "previous" version was actually published
@@ -784,11 +773,12 @@ namespace Umbraco.Core.Services
repository.AddOrUpdate(content.Value);
uow.Commit();
+
+ Saved.RaiseEvent(new SaveEventArgs(content.Value, false), this);
}
- if (Saved != null)
- Saved(contents, e);
-
+ CollectionSaved.RaiseEvent(new SaveEventArgs(contents, false), this);
+
Audit.Add(AuditTypes.Save, "Bulk Save (lazy) content performed by user", userId == -1 ? 0 : userId, -1);
}
}
@@ -1348,12 +1338,22 @@ namespace Umbraco.Core.Services
///
/// Occurs before Save
///
- public static event EventHandler Saving;
-
+ public static event TypedEventHandler> Saving;
+
///
/// Occurs after Save
///
- public static event EventHandler Saved;
+ public static event TypedEventHandler> Saved;
+
+ ///
+ /// Occurs before saving a collection
+ ///
+ public static event TypedEventHandler> CollectionSaving;
+
+ ///
+ /// Occurs after saving a collection
+ ///
+ public static event TypedEventHandler> CollectionSaved;
///
/// Occurs before Create
diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs
index 4d2627a31b..b13f64052f 100644
--- a/src/Umbraco.Core/Services/ContentTypeService.cs
+++ b/src/Umbraco.Core/Services/ContentTypeService.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -114,26 +115,21 @@ namespace Umbraco.Core.Services
/// Optional id of the user saving the ContentType
public void Save(IContentType contentType, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(contentType, e);
+ if (SavingContentType.IsRaisedEventCancelled(new SaveEventArgs(contentType), this))
+ return;
+
+ var uow = _uowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateContentTypeRepository(uow))
+ {
+ SetUser(contentType, userId);
+ repository.AddOrUpdate(contentType);
- if (!e.Cancel)
- {
- var uow = _uowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateContentTypeRepository(uow))
- {
- SetUser(contentType, userId);
- repository.AddOrUpdate(contentType);
+ uow.Commit();
- uow.Commit();
+ SavedContentType.RaiseEvent(new SaveEventArgs(contentType, false), this);
+ }
- if (Saved != null)
- Saved(contentType, e);
- }
-
- Audit.Add(AuditTypes.Save, string.Format("Save ContentType performed by user"), userId == -1 ? 0 : userId, contentType.Id);
- }
+ Audit.Add(AuditTypes.Save, string.Format("Save ContentType performed by user"), userId == -1 ? 0 : userId, contentType.Id);
}
///
@@ -143,29 +139,28 @@ namespace Umbraco.Core.Services
/// Optional id of the user saving the ContentType
public void Save(IEnumerable contentTypes, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(contentTypes, e);
+ if (CollectionSaving.IsRaisedEventCancelled(new SaveEventArgs(contentTypes), this))
+ return;
+
+ var uow = _uowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateContentTypeRepository(uow))
+ {
+ foreach (var contentType in contentTypes)
+ {
+ if (SavingContentType.IsRaisedEventCancelled(new SaveEventArgs(contentType), this))
+ continue;
- if (!e.Cancel)
- {
- var uow = _uowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateContentTypeRepository(uow))
- {
- foreach (var contentType in contentTypes)
- {
- SetUser(contentType, userId);
- repository.AddOrUpdate(contentType);
- }
+ SetUser(contentType, userId);
+ repository.AddOrUpdate(contentType);
+ uow.Commit();
- uow.Commit();
+ SavedContentType.RaiseEvent(new SaveEventArgs(contentType, false), this);
+ }
- if (Saved != null)
- Saved(contentTypes, e);
- }
+ CollectionSaved.RaiseEvent(new SaveEventArgs(contentTypes, false), this);
+ }
- Audit.Add(AuditTypes.Save, string.Format("Save ContentTypes performed by user"), userId == -1 ? 0 : userId, -1);
- }
+ Audit.Add(AuditTypes.Save, string.Format("Save ContentTypes performed by user"), userId == -1 ? 0 : userId, -1);
}
///
@@ -179,28 +174,28 @@ namespace Umbraco.Core.Services
/// Optional Id of the User saving the ContentTypes
public void Save(IEnumerable> contentTypes, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(contentTypes, e);
+ if (CollectionSaving.IsRaisedEventCancelled(new SaveEventArgs(contentTypes), this))
+ return;
+
+ var uow = _uowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateContentTypeRepository(uow))
+ {
+ foreach (var content in contentTypes)
+ {
+ if (SavingContentType.IsRaisedEventCancelled(new SaveEventArgs(content.Value), this))
+ continue;
- if (!e.Cancel)
- {
- var uow = _uowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateContentTypeRepository(uow))
- {
- foreach (var content in contentTypes)
- {
- content.Value.CreatorId = 0;
- repository.AddOrUpdate(content.Value);
- uow.Commit();
- }
+ content.Value.CreatorId = 0;
+ repository.AddOrUpdate(content.Value);
+ uow.Commit();
- if (Saved != null)
- Saved(contentTypes, e);
- }
+ SavedContentType.RaiseEvent(new SaveEventArgs(content.Value, false), this);
+ }
- Audit.Add(AuditTypes.Save, string.Format("Save (lazy) ContentTypes performed by user"), userId == -1 ? 0 : userId, -1);
- }
+ CollectionSaved.RaiseEvent(new SaveEventArgs(contentTypes, false), this);
+ }
+
+ Audit.Add(AuditTypes.Save, string.Format("Save (lazy) ContentTypes performed by user"), userId == -1 ? 0 : userId, -1);
}
///
@@ -337,26 +332,20 @@ namespace Umbraco.Core.Services
/// Optional Id of the user saving the MediaType
public void Save(IMediaType mediaType, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(mediaType, e);
+ if (SavingMediaType.IsRaisedEventCancelled(new SaveEventArgs(mediaType), this))
+ return;
+
+ var uow = _uowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateMediaTypeRepository(uow))
+ {
+ SetUser(mediaType, userId);
+ repository.AddOrUpdate(mediaType);
+ uow.Commit();
- if (!e.Cancel)
- {
- var uow = _uowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateMediaTypeRepository(uow))
- {
- SetUser(mediaType, userId);
- repository.AddOrUpdate(mediaType);
- uow.Commit();
+ SavedMediaType.RaiseEvent(new SaveEventArgs(mediaType, false), this);
+ }
-
- if (Saved != null)
- Saved(mediaType, e);
- }
-
- Audit.Add(AuditTypes.Save, string.Format("Save MediaType performed by user"), userId == -1 ? 0 : userId, mediaType.Id);
- }
+ Audit.Add(AuditTypes.Save, string.Format("Save MediaType performed by user"), userId == -1 ? 0 : userId, mediaType.Id);
}
///
@@ -366,29 +355,29 @@ namespace Umbraco.Core.Services
/// Optional Id of the user savging the MediaTypes
public void Save(IEnumerable mediaTypes, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(mediaTypes, e);
+ if (CollectionSaving.IsRaisedEventCancelled(new SaveEventArgs(mediaTypes), this))
+ return;
- if (!e.Cancel)
- {
- var uow = _uowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateMediaTypeRepository(uow))
- {
+ var uow = _uowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateMediaTypeRepository(uow))
+ {
- foreach (var mediaType in mediaTypes)
- {
- SetUser(mediaType, userId);
- repository.AddOrUpdate(mediaType);
- }
- uow.Commit();
+ foreach (var mediaType in mediaTypes)
+ {
+ if (SavingMediaType.IsRaisedEventCancelled(new SaveEventArgs(mediaType), this))
+ return;
+
+ SetUser(mediaType, userId);
+ repository.AddOrUpdate(mediaType);
+ uow.Commit();
- if (Saved != null)
- Saved(mediaTypes, e);
- }
+ SavedMediaType.RaiseEvent(new SaveEventArgs(mediaType, false), this);
+ }
- Audit.Add(AuditTypes.Save, string.Format("Save MediaTypes performed by user"), userId == -1 ? 0 : userId, -1);
- }
+ CollectionSaved.RaiseEvent(new SaveEventArgs(mediaTypes, false), this);
+ }
+
+ Audit.Add(AuditTypes.Save, string.Format("Save MediaTypes performed by user"), userId == -1 ? 0 : userId, -1);
}
///
@@ -569,12 +558,34 @@ namespace Umbraco.Core.Services
///
/// Occurs before Save
///
- public static event EventHandler Saving;
+ public static event TypedEventHandler> SavingContentType;
///
/// Occurs after Save
///
- public static event EventHandler Saved;
+ public static event TypedEventHandler> SavedContentType;
+
+ ///
+ /// Occurs before Save
+ ///
+ public static event TypedEventHandler> SavingMediaType;
+
+ ///
+ /// Occurs after Save
+ ///
+ public static event TypedEventHandler> SavedMediaType;
+
+
+ ///
+ /// Occurs before saving a collection
+ ///
+ public static event TypedEventHandler> CollectionSaving;
+
+ ///
+ /// Occurs after saving a collection
+ ///
+ public static event TypedEventHandler> CollectionSaved;
+
#endregion
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs
index 76bef9efcb..c5b235c2af 100644
--- a/src/Umbraco.Core/Services/DataTypeService.cs
+++ b/src/Umbraco.Core/Services/DataTypeService.cs
@@ -104,25 +104,20 @@ namespace Umbraco.Core.Services
/// Id of the user issueing the save
public void Save(IDataTypeDefinition dataTypeDefinition, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(dataTypeDefinition, e);
+ if (Saving.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinition), this))
+ return;
+
+ var uow = _uowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateDataTypeDefinitionRepository(uow))
+ {
+ dataTypeDefinition.CreatorId = userId > -1 ? userId : 0;
+ repository.AddOrUpdate(dataTypeDefinition);
+ uow.Commit();
- if (!e.Cancel)
- {
- var uow = _uowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateDataTypeDefinitionRepository(uow))
- {
- dataTypeDefinition.CreatorId = userId > -1 ? userId : 0;
- repository.AddOrUpdate(dataTypeDefinition);
- uow.Commit();
+ Saved.RaiseEvent(new SaveEventArgs(dataTypeDefinition, false), this);
+ }
- if (Saved != null)
- Saved(dataTypeDefinition, e);
- }
-
- Audit.Add(AuditTypes.Save, string.Format("Save DataTypeDefinition performed by user"), userId == -1 ? 0 : userId, dataTypeDefinition.Id);
- }
+ Audit.Add(AuditTypes.Save, string.Format("Save DataTypeDefinition performed by user"), userId == -1 ? 0 : userId, dataTypeDefinition.Id);
}
///
@@ -212,12 +207,12 @@ namespace Umbraco.Core.Services
///
/// Occurs before Save
///
- public static event EventHandler Saving;
+ public static event TypedEventHandler> Saving;
///
/// Occurs after Save
///
- public static event EventHandler Saved;
+ public static event TypedEventHandler> Saved;
#endregion
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs
index 468eeca49c..8b95a755cf 100644
--- a/src/Umbraco.Core/Services/FileService.cs
+++ b/src/Umbraco.Core/Services/FileService.cs
@@ -65,24 +65,19 @@ namespace Umbraco.Core.Services
///
public void SaveStylesheet(Stylesheet stylesheet, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(stylesheet, e);
+ if (SavingStylesheet.IsRaisedEventCancelled(new SaveEventArgs(stylesheet), this))
+ return;
+
+ var uow = _fileUowProvider.GetUnitOfWork();
+ using (var repository = _repositoryFactory.CreateStylesheetRepository(uow))
+ {
+ repository.AddOrUpdate(stylesheet);
+ uow.Commit();
- if (!e.Cancel)
- {
- var uow = _fileUowProvider.GetUnitOfWork();
- using (var repository = _repositoryFactory.CreateStylesheetRepository(uow))
- {
- repository.AddOrUpdate(stylesheet);
- uow.Commit();
+ SavedStylesheet.RaiseEvent(new SaveEventArgs(stylesheet, false), this);
+ }
- if (Saved != null)
- Saved(stylesheet, e);
- }
-
- Audit.Add(AuditTypes.Save, string.Format("Save Stylesheet performed by user"), userId == -1 ? 0 : userId, -1);
- }
+ Audit.Add(AuditTypes.Save, string.Format("Save Stylesheet performed by user"), userId == -1 ? 0 : userId, -1);
}
///
@@ -156,24 +151,19 @@ namespace Umbraco.Core.Services
///
public void SaveScript(Script script, int userId = -1)
{
- var e = new SaveEventArgs();
- if (Saving != null)
- Saving(script, e);
+ if (SavingScript.IsRaisedEventCancelled(new SaveEventArgs