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