【问题标题】:Glass mapper does not load item childeren玻璃映射器不加载项子项
【发布时间】:2016-12-01 16:31:50
【问题描述】:

我们在 Glass mapper 4.0 中遇到了无法加载子项的问题。

这是我们的控制器类,它继承自 GlassController:

public class CarouselController : GlassController
{
    public ActionResult GetCarousel()
    {
        Model = this.GetDataSourceItem<CarouselViewModel>();
        return View(Model);
    }
}

这是我们的视图模型:

public class CarouselViewModel:Carousel_Folder
{      
    [SitecoreChildren]
    public virtual IEnumerable<Carousel> Carousels { get; set; }
}

我们只得到父节点信息而不是结果中的子节点(轮播)

这是我们得到的结果:

[结果图片][1]

此外,使用 TDS 生成了以下类:

[SitecoreType(TemplateId = ICarousel_FolderConstants.TemplateIdString )] //, Cachable = true
public partial interface ICarousel_Folder : IGlassBase
{}

轮播模板继承自两个模板内容库和图像库。

【问题讨论】:

  • 你确定结果是空的吗?您是否尝试扩展结果视图?
  • 你了解IEnumerable和List的区别吗?

标签: sitecore glass-mapper tds


【解决方案1】:

我之前遇到过这个问题,对我来说,我在我的模型中添加了[SitecoreChildren(IsLazy = false)],它工作正常,在你的情况下应该是这样的:

public class CarouselViewModel:Carousel_Folder
{

    [SitecoreChildren(IsLazy = false)]
    public virtual IEnumerable<Carousel> Carousels { get; set; }     

} 

【讨论】:

  • 我有一个查询,我只是在谷歌上搜索了这个“IsLazy”,然后才知道默认情况下它的值为 false。那么,为什么我们需要在这里明确地写出来呢?如果您能帮助我理解这一点,那就太好了。
【解决方案2】:

Carousels 属性似乎不是 Carousel_Folder 模板的一部分,这就是为什么你的接口/类没有类似的东西:

[SitecoreType(TemplateId=ICarousel_FolderConstants.TemplateIdString)]
public partial class Carousel_Folder  : GlassBase, ICarousel_Folder 
{
    [SitecoreField(ICarouselConstants.CarouselsFieldName)]
    public virtual IEnumerable<Carousel> Carousels {get; set;}
}

在这种情况下,您将需要手动获取父项并获取子项,即:

var children = parentItem.Children.Select(x => x.GlassCast<Carousel>())

【讨论】:

  • CarouselViewModel 继承自 Carousel_Folder 并使用 [SitecoreChildren] 定义对其进行扩展,因此该模型对于获取项目的子项是正确的。您添加的代码不需要(或我推荐的):glass.lu/Blog/GettingChildItems
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多