我遇到了以下问题,无法找到解决方法。
答案 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;
}
}