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