Couple of days ago a colleague of mine was looking for a way to determine who moved a page to the recycle bin in EPiServer. Much to my surprise, there is no way to find that out using EPiServer edit / admin mode.
I had been sure that when one moves the page to the recycle bin, the new version is created, but it turned out that there is no single trace who deleted the page. That's why I wrote the code below:
using System;
using System;
using EPiServer;
using EPiServer.Core;
using EPiServer.DataAccess;
namespace Web
{
public class Global : EPiServer.Global
{
protected void Application_Start(Object sender, EventArgs e)
{
DataFactory.Instance.MovedPage += SaveNewVersionIfDeleted;
}
private static void SaveNewVersionIfDeleted(object sender, PageEventArgs e)
{
if (DataFactory.Instance.IsWastebasket(e.TargetLink))
{
PageData deletedPage = DataFactory.Instance.GetPage(e.PageLink).CreateWritableClone();
SaveAction action = SaveAction.ForceNewVersion;
action |= (deletedPage.PendingPublish) ? SaveAction.Save : SaveAction.Publish;
DataFactory.Instance.Save(deletedPage, action);
}
}
}
}
The code is very short and simple. In Application_Start method of the Global.asax.cs I added a new method to the DataFactory.Instance.MovedPage handler. This method checks whether the target is recycle bin and forces a new version of the page. Now if you check the version list of any of the page in the recycle bin, the latest version shows you who and when deleted the page.
June 18, 2010 at 1:29 PM
Very nice, and like always useful, but like I have said you before, implementing you own custom HttpModule is in my opinion a better place place to put functionality like that.
Damian ;)
June 18, 2010 at 4:11 PM
I have to respectfully disagree, why would you use HttpModuel for something that intrinsicly is a prt of an EPiServer workflow.
Why would you want to have something fired on every request when you can only have it run on that specific occasion?
June 18, 2010 at 7:55 PM
June 19, 2010 at 12:15 AM
Regarding the discussion about a HTTP module or not, I would say that the cleanest and most reusable (in terms of ease of use) way would be to use the new and great concept introduced in CMS of an InitializableModule (more info: http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-60/Initialization/#Creating)
June 19, 2010 at 8:58 PM
June 21, 2010 at 11:28 AM
First of all for me it doesn't matter if this is a part of EPiServer or not, Global.asax is neither. I'm just saying that single responsibility principle and as Joel wrote (thank you, and great talks during Summit, by the way) reusable reasons lead me to use the HttpModule.
Second - Modules are created per working thread (as far as I know), and this is up to you which event you choose to attach to. Therefore it doesn't have to be a BeginRequest one, it can be the Moved page or whatever you are interested in. One thing which we have to keep in mind is to unbind it when ASP.NET engine removes the module.
Damian