using Sitecore.Data.Fields;
using Sitecore.Data.Items;
using Sitecore.Mvc.Configuration;
using Sitecore.Mvc.Extensions;
using Sitecore.Mvc.Pipelines;
using Sitecore.Mvc.Pipelines.Response.GetPageRendering;
using Sitecore.Mvc.Pipelines.Response.RenderPlaceholder;
using Sitecore.Mvc.Presentation;
using System.Collections.Generic;
using Website.BLL.Logging;
using Website.BLL.MvcAreas.Pipelines;
namespace MoneYou.PersonalPage.BLL.ItemRenderer
public class ItemRenderer
public Item Item { get; set; }
public ItemRenderer(Item item)
public virtual string Render()
using (TextWriter tw = new StringWriter())
public virtual void Render(TextWriter writer)
var originalDisplayMode = Context.Site.DisplayMode;
PageDefinition originalRenderingDefinitionContext = null;
if (RenderingContext.CurrentOrNull != null && RenderingContext.CurrentOrNull.PageContext != null)
originalRenderingDefinitionContext = RenderingContext.CurrentOrNull.PageContext.PageDefinition;
if (Context.PageMode.IsExperienceEditorEditing)
Context.Site.SetDisplayMode(DisplayMode.Preview, DisplayModeDuration.Temporary);
var pageDef = new PageDefinition
Renderings = new List<Rendering>()
pageDef.Renderings.AddRange(GetRenderings(GetLayoutFromItem()));
var pageRenderingArgs = new GetPageRenderingArgs(pageDef);
PipelineService.Get().RunPipeline("mvc.getPageRendering", pageRenderingArgs);
var renderPlaceholderArgs = new RenderPlaceholderArgs(PerformItemRendering.ItemRenderingKey, writer, pageRenderingArgs.Result)
PageContext = new PageContext
using (PageRenderItemDefinitionContext.Enter(new PageRenderItemDefinitionContext(pageDef, Item, originalDisplayMode)))
PipelineService.Get().RunPipeline("mvc.renderPlaceholder", renderPlaceholderArgs);
if (originalRenderingDefinitionContext != null)
RenderingContext.CurrentOrNull.PageContext.PageDefinition = originalRenderingDefinitionContext;
Context.Site.SetDisplayMode(originalDisplayMode, DisplayModeDuration.Temporary);
protected virtual XElement GetLayoutFromItem()
var innerField = new LayoutField(Item).InnerField;
var fieldValue = LayoutField.GetFieldValue(innerField);
if (fieldValue.IsWhiteSpaceOrNull())
return XDocument.Parse(fieldValue).Root;
protected virtual Rendering GetRendering(XElement renderingNode, Guid deviceId, Guid layoutId, string renderingType, XmlBasedRenderingParser parser)
var rendering = parser.Parse(renderingNode, false);
rendering.DeviceId = deviceId;
rendering.LayoutId = layoutId;
if (renderingType != null)
rendering.RenderingType = renderingType;
if (string.IsNullOrWhiteSpace(rendering.DataSource)) rendering.DataSource = Item.ID.ToString();
protected virtual IEnumerable<Rendering> GetRenderings(XElement layoutDefinition)
var parser = MvcSettings.GetRegisteredObject<XmlBasedRenderingParser>();
foreach (var xelement in layoutDefinition.Elements("d"))
var deviceId = xelement.GetAttributeValueOrEmpty("id").ToGuid();
var layoutId = xelement.GetAttributeValueOrEmpty("l").ToGuid();
yield return GetRendering(xelement, deviceId, layoutId, "Layout", parser);
foreach (var renderingNode in xelement.Elements("r"))
yield return GetRendering(renderingNode, deviceId, layoutId, renderingNode.Name.LocalName, parser);