Created
February 1, 2017 07:21
-
-
Save blacktambourine/3f29767f6b538c155c224403ac343920 to your computer and use it in GitHub Desktop.
Handle errors and missing datasource in GlassViews
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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