2015-11-13 41 views
1

我正面临下面的问题,无法找到如何解决它。当数据源项不存在时,Sitecore 8抛出null异常

  1. 我有一个渲染,它的数据源指向树中的一个项目。
  2. 我发布渲染,但我不发布引用的项目。
  3. 在查看页面时,我收到一条错误消息。 [附是误差我得到的屏幕截图]我使用玻璃映射器

enter image description here

在此先感谢您的帮助。

+0

将玻璃的版本映射器? –

回答

2

要精心jammykam的答案,你可以这样做下面我将在本blog

配置补丁已经找到了代码:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <pipelines> 
     <mvc .getrenderer=""> 
     <processor patch:instead="processor[@type='Sitecore.Mvc.Pipelines.Response.GetRenderer.GetViewRenderer, Sitecore.Mvc']" type="Namespace.To.Sitecore.Pipelines.Response.GetRenderer.GetViewRendererWithItemValidation, Library"> 
     </processor> 
     </mvc> 
    </pipelines> 
    </sitecore> 
</configuration> 

代码:

public class GetViewRendererWithItemValidation : GetViewRenderer 
{  ` 
    protected override Renderer GetRenderer(Rendering rendering, GetRendererArgs args) 
    {   
     var viewRenderer = base.GetRenderer(rendering, args) as ViewRenderer; 
     if (viewRenderer == null) 
      return null; 

     // Ignore item check when in page editor 
     // Also this will break if the item for the datasource has been deleted without removing the link. 
     if (Context.PageMode.IsPageEditor || Context.PageMode.IsPageEditorEditing) 
      return viewRenderer; 

     // Override renderer to null when there is an unpublished item refererenced by underlying view 
     return viewRenderer.Rendering.Item != null && viewRenderer.Rendering.RenderingItem.InnerItem != null 
      ? viewRenderer 
      : null; 
    } 
} 
3

最好的解决方案是进入mvc.getRenderer管道并验证数据源实际存在,否则优雅地回退。

有许多已经提出了这个解决方案,是一个著名的 “问题”,虽然它不是一个玻璃具体问题:

所有这些解决方案检查数据源项是否存在,在正常模式下,错误被吞噬,但在页面编辑器模式下,编辑器会显示一条警告信息,以显示数据源需要在没有被选中的情况下设置的事实。

这也是在Glass Mapper中的raised as an issue与类似的解决方案。