private static void BuildServerSidePage(Control nativeRoot, PageCompositionElement pp)
        {
            foreach (var kvp in pp.PlaceHolders)
            {
                var placeHolder = kvp.Value;

                Control contentPlaceHolder = nativeRoot.FindControl(placeHolder.Id);

                if (contentPlaceHolder == null)
                {
                    throw new Exception("Placeholder " + placeHolder.Id + " does not exist.");
                }

                foreach (var placedRendering in placeHolder.Renderings)
                {
                    if (placedRendering is WebFormsControlPageCompositionElement)
                    {
                        WebFormsControlPageCompositionElement webFormsCompositionElement = ((WebFormsControlPageCompositionElement)placedRendering);
                        AddRenderHtmlDirective(webFormsCompositionElement, contentPlaceHolder);

                        var control = webFormsCompositionElement.GetControl();
                        BuildServerSidePage(control, placedRendering);
                    }
                    else
                    {
                        var directive = AddDoNotRenderDirective(placedRendering, contentPlaceHolder);
                        BuildServerSidePage(directive, placedRendering);
                    }
                }
            }
        }
        public void BeginWriting(PageCompositionElement pp)
        {
            if (pp.ContentId == Guid.Empty)
            {
                throw new ArgumentException($"Invalid page content id of '{pp.ContentId}' for {pp.FriendlyName}");
            }

            var id = pp.ContentId;

            if (_idStack.Count > 0)
            {
                var sb = this.GetStringBuilder();
                if (!output[_idStack.Peek()].InlineRenderingFragments.Any())
                {
                    output[_idStack.Peek()].InlineRenderingFragments.Add(new HtmlOutput(sb));
                }

                sb.Clear();
            }

            _idStack.Push(id);

            if (output.ContainsKey(id))
            {
                throw new Exception($"Output for CmsPageContent {id} has already been recorded.");
            }

            output.Add(id, new RenderingResult());
        }
Exemple #3
0
        public RenderingFragmentCollection Execute(PageCompositionElement pp)
        {
            var batch   = new RenderingFragmentCollection();
            var allDesc = pp.GetAllDescendents().OfType <CachedContentPageCompositionElement>();

            foreach (var item in allDesc)
            {
                batch.RenderingResults.Add(item.ContentId, item.RenderingResult);
            }

            return(batch);
        }
            private void AddContent(PageCompositionElement parentCompositionElement,
                                    IReadOnlyCollection <PageContent> contents, bool isFromLayout)
            {
                foreach (var content in contents)
                {
                    var placementPlaceHolder = FindPlacementLocation(parentCompositionElement, content);
                    if (placementPlaceHolder == null)
                    {
                        continue;
                    }

                    AddContent(placementPlaceHolder, content, isFromLayout);
                }
            }
 private static RenderingsPlaceHolder FindPlacementLocation(PageCompositionElement searchContext, PageContent content)
 {
     if (!string.IsNullOrWhiteSpace(content.PlacementContentPlaceHolderId))
     {
         try
         {
             return(searchContext.PlaceHolders[content.PlacementContentPlaceHolderId]);
         }
         catch (KeyNotFoundException)
         {
         }
     }
     return(searchContext.PlaceHolders.FirstOrDefault().Value); //should this be ordered?
 }
        private static DoNotRenderHtmlWriterDirective AddDoNotRenderDirective(PageCompositionElement placedRendering, Control contentPlaceHolder)
        {
            var control = new DoNotRenderHtmlWriterDirective {
                ID = placedRendering.LocalId
            };

            foreach (var nonWebFormsPlaceHolder in placedRendering.PlaceHolders.Values)
            {
                control.Controls.Add(new DoNotRenderHtmlWriterDirective {
                    ID = nonWebFormsPlaceHolder.Id
                });
            }

            contentPlaceHolder.Controls.Add(control);

            return(control);
        }
        private void WriteSubstitution(PageCompositionElement pp, RenderAttributes renderAttributes, RenderingsPlaceHolder relevantPlaceHolder, ComposedHtmlWriter local)
        {
            //var renderDesignElements = !pp.IsFromLayout && renderAttributes.Mode == FragmentRenderMode.PageDesigner;

            //if (renderDesignElements)
            //{
            //    var dropTargetBegin = _pageDesignerHtmlFactory.CreateDropTargetBeginMarker(pp, relevantPlaceHolder);
            //    local.Append(dropTargetBegin);
            //}



            //foreach (var item in relevantPlaceHolder.Renderings)
            //    Render(item, renderAttributes, local);

            //if (renderDesignElements)
            //{
            //    var dropTargetEnd = _pageDesignerHtmlFactory.CreateDropTargetEndMarker();
            //    local.Append(dropTargetEnd);
            //}
        }
        public RenderingFragmentCollection Execute(PageCompositionElement pp)
        {
            RenderingFragmentCollection collection = new RenderingFragmentCollection();

            var allDescendents = pp.GetAllDescendents().OfType <StaticContentPageElement>().ToList();

            foreach (var item in allDescendents)
            {
                var staticContent = item.ContentControl;

                collection.RenderingResults.Add(item.ContentId, new RenderingResult
                {
                    GlobalRendering          = staticContent.GlobalContent.ToDictionary(x => x.Key, x => new[] { x.Value }.ToList()),
                    InlineRenderingFragments = new List <IRenderingFragment> {
                        new HtmlOutput(staticContent.Html)
                    }
                });
            }

            return(collection);
        }
        private void Render(PageCompositionElement pp, RenderAttributes attributes, ComposedHtmlWriter local)
        {
            if (!_page.RenderingResults.ContainsKey(pp.ContentId))
            {
                throw new Exception("There is no rendering fragment available for " + pp.FriendlyName + " with content id " + pp.ContentId);
            }

            var metadata = new CompostedContentMetdata
            {
                ContentId = pp.ContentId,
                NodeType  = FragmentType.Element
            };

            local.BeginWriting(metadata);

            var renderingResultForElement = _page.RenderingResults[pp.ContentId];

            for (var index = 0; index < renderingResultForElement.InlineRenderingFragments.Count; index++)
            {
                var part    = renderingResultForElement.InlineRenderingFragments[index];
                var isFirst = index == 0;
                var isLast  = index == renderingResultForElement.InlineRenderingFragments.Count - 1;


                if (part is HtmlOutput)
                {
                    var htmlOutput       = (HtmlOutput)part;
                    var renderAttributes = new RenderAttributes
                    {
                        Mode = attributes.Mode,
                        IsFirstContentPart = isFirst,
                        IsLastContentPart  = isLast
                    };

                    local.Write(htmlOutput.Html);


                    continue;
                }

                if (part is GlobalSubstitutionOutput)
                {
                    var global = (GlobalSubstitutionOutput)part;
                    local.BeginWriting(new CompostedContentMetdata
                    {
                        NodeType = FragmentType.GlobalSubstitution
                    });

                    foreach (var s in _globals[global.Id])
                    {
                        local.Write(string.Join("", s));
                    }

                    local.EndWriting();



                    //if (attributes.Mode == FragmentRenderMode.PageDesigner)
                    //{
                    //    if (global.Id == GlobalLayoutPlaceHolderIds.Head)
                    //    {

                    //    }

                    //    if (global.Id == GlobalLayoutPlaceHolderIds.Scripts)
                    //    {
                    //        var head = _pageDesignerHtmlFactory.LoadPageDesignerHead();
                    //        var style = _pageDesignerHtmlFactory.LoadPageDesignerStyle();

                    //        local.Append(head);
                    //        local.Append(style);

                    //        var scripts = _pageDesignerHtmlFactory.LoadPageDesignerScripts();
                    //        local.Append(scripts);
                    //    }

                    //    if (global.Id == GlobalLayoutPlaceHolderIds.InternalStateTracking)
                    //    {


                    //        var tags = _pageDesignerHtmlFactory.CreatePageDesignerStateTags();
                    //        local.Append(string.Join(string.Empty,tags));
                    //    }


                    //}

                    continue;
                }

                if (part is LayoutSubstitutionOutput)
                {
                    var subPart             = (LayoutSubstitutionOutput)part;
                    var relevantPlaceHolder = pp.PlaceHolders[subPart.Id];
                    var renderAttributes    = new RenderAttributes
                    {
                        Mode = attributes.Mode,
                        IsFirstContentPart = isFirst,
                        IsLastContentPart  = isLast
                    };


                    local.BeginWriting(new CompostedContentMetdata
                    {
                        PlaceHolderId = subPart.Id,
                        NodeType      = FragmentType.LayoutSubtitution,
                    });

                    foreach (var item in relevantPlaceHolder.Renderings)
                    {
                        Render(item, renderAttributes, local);
                    }

                    local.EndWriting();

                    continue;
                }

                throw new ArgumentException();
            }

            local.EndWriting();
        }
        public RenderingFragmentCollection Execute(PageCompositionElement pp)
        {
            SwitchingHtmlWriter _writer = new SwitchingHtmlWriter();


            var isWebFormsInChargeOfPageBase = pp is WebFormsPageCompositionElement;

            if (isWebFormsInChargeOfPageBase)
            {
                var nativePageRendering = (WebFormsPageCompositionElement)pp;
                var nativePage          = nativePageRendering.GetPage();
                nativePage.PreInit += (sender, args) =>
                {
                    var topMostControl = nativePage.GetRootControl();
                    foreach (var ph in pp.PlaceHolders.Values)
                    {
                        var contentPlaceHolder = topMostControl.FindControl(ph.Id);
                        contentPlaceHolder.Controls.Add(new SubsitutionHtmlWriterDirective(ph));
                    }

                    BuildServerSidePage(topMostControl, pp);
                };
                nativePage.Init += (sender, args) =>
                {
                };
                nativePage.InitComplete += (sender, args) =>
                {
                    if (nativePage.Header == null)
                    {
                        throw new Exception(
                                  "Add a <head runat='server'> tag in order to use this master page as a layout.");
                    }

                    if (nativePage.Form == null)
                    {
                        throw new Exception(
                                  "Add a <form runat='server'> tag in order to use this master page as a layout.");
                    }


                    nativePage.Header.Controls.Add(new GlobalSubstitionComponent(GlobalLayoutPlaceHolderIds.Head));
                    nativePage.Form.Controls.Add(new GlobalSubstitionComponent(GlobalLayoutPlaceHolderIds.Scripts));
                    nativePage.Form.Controls.Add(new GlobalSubstitionComponent(GlobalLayoutPlaceHolderIds.InternalStateTracking));
                };


                _writer.BeginWriting(pp);


                var originalHandler = HttpContext.Current.Handler;
                try
                {
                    HttpContext.Current.Handler = nativePage; // required in order to process postbacks.
                                                              // if aspnet thinks that another renderer is in charge of the
                                                              // the execution, then 'GET' content is returned only.

                    HttpContext.Current.Server.Execute(nativePage, _writer, true);
                }
                finally
                {
                    HttpContext.Current.Handler = originalHandler;
                }

                _writer.EndWriting();
            }
            else
            {
                var nativeRoot = new System.Web.UI.Page();
                var body       = new HtmlGenericControl("body");
                var form       = new HtmlGenericControl("form");


                var wrapper = new RenderHtmlWriterDirective(new WebFormsControlPageCompositionElement(body)
                {
                    ContentId = SpecialRenderingFragmentContentIds.WebFormsInterop
                });
                wrapper.Controls.Add(body);
                wrapper.Initialize();

                body.Controls.Add(form);
                nativeRoot.Controls.Add(wrapper);

                foreach (var placeholder in pp.PlaceHolders)
                {
                    form.Controls.Add(new ContentPlaceHolder {
                        ID = placeholder.Value.Id
                    });
                }

                BuildServerSidePage(nativeRoot, pp);
                HttpContext.Current.Server.Execute(nativeRoot, _writer, true);
            }

            return(new RenderingFragmentCollection
            {
                RenderingResults = _writer.output,
            });
        }
        public RenderingFragmentCollection Execute(PageCompositionElement pp)
        {
            RenderingFragmentCollection collection = new RenderingFragmentCollection();

            var allDescendents = pp.GetAllDescendents().OfType <ControllerPageCompositionElement>();

            foreach (var item in allDescendents)
            {
                //todo: cache.
                var descriptor = new ReflectedAsyncControllerDescriptor(item.Controller.GetType());

                using (var writer = new SwitchingHtmlWriter())
                {
                    var fake = new NoResponseHttpContextBase(HttpContext.Current, writer);
                    var rq   = new RequestContext
                    {
                        HttpContext = fake,
                    };
                    rq.RouteData = new RouteData();
                    rq.RouteData.Values.Add("controller", descriptor.ControllerName);
                    rq.RouteData.Values.Add("action", "Index");

                    writer.BeginWriting(item);
                    item.Controller.Execute(rq);
                    writer.EndWriting();


                    collection.RenderingResults.Add(item.ContentId, writer.output[item.ContentId]);

                    //var placeholderOrder = new Dictionary<string, int>();
                    //foreach (var phId in item.PlaceHolders.Keys)
                    //    placeholderOrder.Add(phId,
                    //        output.IndexOf($"[##Placeholder({nonce+"-"+phId})]", StringComparison.OrdinalIgnoreCase));

                    //var phLocations = placeholderOrder.OrderBy(x => x.Value).Select(x => x.Key).ToList();

                    //List<IRenderingFragment> captured = new List<IRenderingFragment>();
                    //var allSegments = phLocations.Select(x => new{Id=x,Marker=$"[##Placeholder({nonce+"-"+x})]"}).ToList();

                    //var remainingOutput = output;
                    //foreach (var segment in allSegments)
                    //{
                    //    var at = remainingOutput.IndexOf(segment.Marker,StringComparison.OrdinalIgnoreCase);
                    //    if (at == -1)
                    //        throw new Exception("Placeholder with id '" + segment.Id+
                    //                            "' was defined in the internal layout, but was not rendered.");

                    //    var capturedHtml = remainingOutput.Substring(0, at);
                    //    if (capturedHtml.Length >0)
                    //        captured.Add(new HtmlOutput(capturedHtml));

                    //    captured.Add(new LayoutSubstitutionOutput{Id=segment.Id});

                    //    remainingOutput = remainingOutput.Substring(at + segment.Marker.Length);
                    //}
                    //if (remainingOutput.Length >0)
                    //    captured.Add(new HtmlOutput(remainingOutput));



                    //collection.WidgetContent.Add(item.ContentId,captured);
                }
            }
            return(collection);
        }
 public void AddLayoutContent(IReadOnlyCollection <PageContent> contentToActivate, PageCompositionElement parentCompositionElement)
 {
     AddContent(parentCompositionElement, contentToActivate, true);
 }
 public void AddAdHocContent(PageContent contentToActivate, PageCompositionElement page)
 {
     AddContent(page, new[] { contentToActivate }, false);
 }
        public bool TryCreateCachedContentElement(Type toolboxItemType, PageContent pageContent, out PageCompositionElement element, out string cacheKey)
        {
            element = null;
            CachedPageContentOutput found = null;
            var cacheKeyParts             = new CacheKeyParts {
                ContentId = pageContent.Id, Parameters = pageContent.Parameters, WidgetType = toolboxItemType
            };
            var isCacheable = _cmsPageContentOutputCacheProvider.IsCacheable(toolboxItemType);

            cacheKey = null;
            if (isCacheable)
            {
                cacheKey = _cmsPageContentOutputCacheProvider.GetCacheKey(cacheKeyParts);
            }

            var canBeActivatedViaCache = isCacheable && _cmsPageContentOutputCacheProvider.TryResolveFromCache(cacheKey, out found);

            if (!canBeActivatedViaCache)
            {
                return(false);
            }

            element = new CachedContentPageCompositionElement
            {
                InternalLayout  = found.InternalLayout,
                RenderingResult = found.RenderingResult
            };

            return(true);
        }