Helping UI team with Sitecore rendering info


Identifying the root cause of any issue feels like a great achievement. Developers get that kick with debugging. One of the issues I heard from UI developers is that they don't know about the rendering and view details (MVC) to update the view and rendering item.

I looked at the pipelines and thought 'mvc.renderRendering' pipeline could be a suitable candidate to add this information. I wrote the below file to add rendering details as html comments at the end of each rendering. Currently the implementation has issues interfering with Sitecore client itself. Also, I wanted to add this information to top and bottom of the rendering but couldn't think of how I can do it without creating new Stream.

Couple of things I have in mind to make it better is, create a new pipeline that gets called from renderRendering which gives flexibility to add more wrapping content. Perform it only when compilation debug set to true or  some setting like 'Add Rendering Info' in 'Core' DB is set to true. Don't want to have the publish hassle.

Rendering information added to html output
Rendering information added to html output

Here is the xml config


1
2
3
4
<mvc.renderRendering>
        <processor patch:after="*[last()]"
          type="RenderingInfo.Pipelines.mvcRenderRendering.AddRenderingDetailsNew, RenderingInfo" />
 </mvc.renderRendering>


And below is the actual class


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using Sitecore;
using Sitecore.Data.Items;
using Sitecore.Mvc.Names;
using Sitecore.Mvc.Pipelines.Response.RenderRendering;
using Sitecore.Mvc.Presentation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace RenderingInfo.Pipelines.mvcRenderRendering
{
    public class AddRenderingDetailsNew : RenderRenderingProcessor
    {
        public override void Process(RenderRenderingArgs args)
        {
            if(args.Rendered == true)
            {
                StringBuilder sb = new StringBuilder(Environment.NewLine);

                AddRenderingDetailsStart(args, sb);
                AddRenderingDetailsDefault(args, sb);
                AddRenderingDetailsByRendererType(args, sb);
                AddRenderingDetailsEnd(args, sb);
                args.Writer.Write(sb.ToString());
            }

        }

        protected void AddRenderingDetailsStart(RenderRenderingArgs args, StringBuilder sb)
        {
            sb.AppendLine(@"<!--");
        }
        protected void AddRenderingDetailsEnd(RenderRenderingArgs args, StringBuilder sb)
        {
            sb.AppendLine(@"-->");
        }

        protected void AddRenderingDetailsDefault(RenderRenderingArgs args, StringBuilder sb)
        {
            sb.AppendLine(@"Template Name: " + args.Rendering.RenderingItem.InnerItem.TemplateName);
            sb.AppendLine(@"Rendering Name: " + args.Rendering.RenderingItem.InnerItem.Name);
            sb.AppendLine(@"Placeholder: " + args.Rendering.Placeholder);
            sb.AppendLine(@"Rendering Item Path: " + args.Rendering.RenderingItemPath);
            sb.AppendLine(@"Rendering DataSource: " + args.Rendering.DataSource);
        }

        protected void AddRenderingDetailsByRendererType(RenderRenderingArgs args, StringBuilder sb)
        {
            AddViewRenderingDetails(args, sb);
            AddControllerRenderingDetails(args, sb);
        }

        protected void AddViewRenderingDetails(RenderRenderingArgs args, StringBuilder sb)
        {
            var renderingItem = args.Rendering.RenderingItem;
            if (renderingItem == null && renderingItem.InnerItem.TemplateID == TemplateIds.ViewRendering)
            {
                string path = renderingItem.InnerItem["path"];
                if (!String.IsNullOrWhiteSpace(path))
                {
                    sb.AppendLine(@"Template Name: " + path);
                }

            }
        }

        protected void AddControllerRenderingDetails(RenderRenderingArgs args, StringBuilder sb)
        {
            var renderingItem = args.Rendering.RenderingItem;
            var controllerRenderer = args.Rendering.Renderer as ControllerRenderer;
            if (controllerRenderer != null)
            {
                sb.AppendLine(@"Controller Name: " + controllerRenderer.ControllerName);
                sb.AppendLine(@"Action Name: " + controllerRenderer.ActionName);
            }
        }
    }
}

Let me know what you think about it. And suggestions invited :)

Comments