London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!

Intercept when SitePage is passed to a controller method

Vote:
 

I kind of have the same problem as this person: http://stackoverflow.com/questions/29389926/why-is-the-icontentevents-loadedcontent-event-fired-multiple-times-for-a-page

I basicaly want to intercept whenever SitePage is passed to a controller method.

I tried using IContentLoader.LoadedContent, but if the method is fired about 20 times for each page request then I can't use it.

Can anybody outhere enligten me on the subject?

Here is my code:

[InitializableModule]
    [ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
    public class LoadedContentEventInitializationModule : IInitializableModule
    {
        //internal Injected CustomPageLoaderService;

        public void Initialize(InitializationEngine context)
        {
            //Add initialization logic, this method is called once after CMS has been initialized            
            var contentEvents = ServiceLocator.Current.GetInstance();
            contentEvents.LoadedContent += contentEvents_LoadedContent;

        }

        private void contentEvents_LoadedContent(object sender, ContentEventArgs e)
        {
            var pageData = e.Content as SitePage;
            if (pageData != null)
            {
                //CustomPageLoaderService.Service.LoadPage(pageData);
            }
        }

        public void Uninitialize(InitializationEngine context)
        {
            //Add uninitialization logic            
            var contentEvents = ServiceLocator.Current.GetInstance();            
            contentEvents.PublishingContent -= contentEvents_LoadedContent;
        }
    }
#171690
Nov 15, 2016 10:02
Vote:
 

Depends on what you want to do but for example a custom action filter lets you run code before the action is called.

#171705
Nov 15, 2016 15:13
Vote:
 

Yeah, I guessed as much. I just thought that there was some better way of implementing it.

Thanks!

This is what I did:

[TemplateDescriptor(Inherited = true)]
    [LoadCustomData]
    public class DefaultPageController : PageController<PageData>
    {
        public virtual ActionResult Index(PageData currentPage)
        {
            return View($"~/Views/{currentPage.GetOriginalType().Name}/Index.cshtml", currentPage);
        }
    }
    public class LoadCustomDataAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            object currentPage;
            if (filterContext.ActionParameters.TryGetValue("currentPage", out currentPage))
            {
                ServiceLocator.Current.GetInstance<ICustomPageLoaderService>().LoadCustomData(currentPage as PageData, filterContext.HttpContext.User);
            }
            base.OnActionExecuting(filterContext);
        }
    }




#171716
Nov 16, 2016 8:56
This topic was created over six months ago and has been resolved. If you have a similar question, please create a new topic and refer to this one.
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.