private static RenderHtmlWriterDirective AddRenderHtmlDirective(WebFormsControlPageCompositionElement placedRendering, Control contentPlaceHolder) { var compositionElement = (WebFormsControlPageCompositionElement)placedRendering; var wrapped = new RenderHtmlWriterDirective(compositionElement); contentPlaceHolder.Controls.Add(wrapped); wrapped.Initialize(); return(wrapped); }
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, }); }