当数据源项不存在时,Sitecore 8抛出null异常

时间:2015-11-13 05:30:33

标签: sitecore sitecore8 glass-mapper

我遇到了以下问题,无法找到解决方法。

  1. 我有一个渲染,它的数据源指向树中的一个项目。
  2. 我发布了渲染但我没有发布引用的项目。
  3. 在查看页面时,我收到错误消息。 [附件是我得到的错误的屏幕截图]
  4. enter image description here

    我正在使用玻璃贴图。

    提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

已经为此提出了许多解决方案,这是一个已知的“问题”,尽管它不是特定于Glass的问题:

所有这些解决方案都检查数据源项是否存在,在正常模式下吞下错误但在页面编辑器模式下会向编辑器显示警告,因此显示在未选择任何数据源的情况下需要设置数据源的事实。

Glass Mapper中的raised as an issue也有类似的解决方案。

答案 1 :(得分: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;
    }
}