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);
        }