Skip to content

Instantly share code, notes, and snippets.

@blacktambourine
Created February 1, 2017 07:21
Show Gist options
  • Save blacktambourine/3f29767f6b538c155c224403ac343920 to your computer and use it in GitHub Desktop.
Save blacktambourine/3f29767f6b538c155c224403ac343920 to your computer and use it in GitHub Desktop.
Handle errors and missing datasource in GlassViews
using Diversus.Core.Sitecore.ViewRenderers;
using Sitecore.Mvc.Extensions;
using Sitecore.Mvc.Pipelines.Response.GetRenderer;
using Sitecore.Mvc.Presentation;
namespace Diversus.Core.Sitecore.Pipeline
{
public class GetViewRendererWithItemValidation : GetViewRenderer
{
/// <summary>
/// Based on solution by Hedgehog, which gracefully outputs exception error messages in Experience Editor
/// http://www.hhog.com/blog/robust-mvc-rendering-exception-handler/
/// </summary>
/// <param name="rendering"></param>
/// <param name="args"></param>
/// <returns></returns>
protected override Renderer GetRenderer(Rendering rendering, GetRendererArgs args)
{
string viewPath = this.GetViewPath(rendering, args);
if (viewPath.IsWhiteSpaceOrNull())
{
return null;
}
if (rendering.RenderingType != "Layout" &&
rendering.RenderingItem != null &&
string.IsNullOrEmpty(rendering.RenderingItem.DataSource))
{
return new NoDatasourceSafeViewRenderer
{
ViewPath = viewPath,
Rendering = rendering
};
}
//Return the default view renderer if rendering something from core or the page layout
if (rendering.RenderingType == "Layout" ||
rendering.RenderingItem == null ||
rendering.RenderingItem.Database == null ||
rendering.RenderingItem.Database.Name == "core")
{
return GetDefaultViewRenderer(rendering, viewPath);
}
//else safely handle the Exception for this View
return new ExceptionSafeViewRenderer
{
ViewPath = viewPath,
Rendering = rendering
};
}
private static ViewRenderer GetDefaultViewRenderer(Rendering rendering, string viewPath)
{
//Handle the scenario where there is no Datasource but one is expected by the View
if (rendering.RenderingItem != null && string.IsNullOrEmpty(rendering.RenderingItem.DataSource))
{
return new NoDatasourceSafeViewRenderer
{
ViewPath = viewPath,
Rendering = rendering
};
}
//else return default
return new ViewRenderer
{
ViewPath = viewPath,
Rendering = rendering
};
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment