public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (CurrentPage == null)
            {
                output.Content.SetHtmlContent("Page object (sde-page) cannot be null");
                return;
            }

            if (ModuleActionResults == null)
            {
                output.Content.SetHtmlContent("Module action results  (sde-module-results) cannot be null");
                return;
            }

            if (CurrentPage.Layout == null)
            {
                output.Content.SetHtmlContent("Layout is not configured, choose a layout");
                return;
            }

            try
            {
                ((HtmlHelper)_htmlHelper).Contextualize(ViewContext);

                PageLayout pageLayout = new PageLayout();
                pageLayout.Name = CurrentPage.Layout.Name;

                var properties = _propertyRepository.GetProperties();
                pageLayout.PlaceHolders = JsonConvert.DeserializeObject <List <PlaceHolder> >(CurrentPage.Layout.Config);

                GetPropertyValue(pageLayout.PlaceHolders, properties);

                PageContents = Mapper.Map <ICollection <PageContent> >(CurrentPage.PageContent);

                //Copy property options from master data
                if (PageContents != null && PageContents.Count > 0)
                {
                    foreach (var pageContent in PageContents)
                    {
                        if (pageContent.ContentType.Properties != null && pageContent.ContentType.Properties.Count > 0)
                        {
                            foreach (var prop in pageContent.ContentType.Properties)
                            {
                                var propValue = pageContent.Properties.FirstOrDefault(p => p.Id == prop.Id);
                                if (propValue != null)
                                {
                                    propValue.OptionListId = prop.OptionListId;
                                    propValue.OptionList   = prop.OptionList;
                                }
                            }
                        }
                    }
                }

                if (pageLayout.PlaceHolders != null && pageLayout.PlaceHolders.Count > 0)
                {
                    HtmlContentBuilder result = RenderContentItems(pageLayout.PlaceHolders);
                    if (ModuleActionResults.Count > 0)
                    {
                        //One or more modules are not added in containers
                        foreach (var moduleActionResult in ModuleActionResults)
                        {
                            if (moduleActionResult.Value != null && moduleActionResult.Value.Count > 0)
                            {
                                foreach (var contentResult in moduleActionResult.Value)
                                {
                                    //result += contentResult.HtmlResult;
                                    result.AppendHtml(contentResult.HtmlResult);
                                }
                            }
                        }
                    }
                    output.Content.SetHtmlContent(result);

                    //Release all resources
                    pageLayout.RegisterForDispose(ViewContext.HttpContext);
                    PageContents.GetEnumerator().RegisterForDispose(ViewContext.HttpContext);
                    ModuleActionResults.GetEnumerator().RegisterForDispose(ViewContext.HttpContext);
                    pageLayout.RegisterForDispose(ViewContext.HttpContext);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }