Sitecore Glass Mapper(v3)用于未填充基于查询的属性

Rob*_*ray 1 sitecore sitecore7 glass-mapper

更新:我正在使用Sitecore 7.0版

到目前为止,我正在使用Glass.Mapper.Sc.我已经成功映射了许多模型.我现在只是尝试了我的第一个Query映射,无法让它工作.

我有以下两种型号

[SitecoreType(TemplateName = "Testimonial")]
public class Testimonial : ContentItem
{
    [SitecoreField(FieldType = SitecoreFieldType.MultiLineText)]
    public virtual string Summary { get; set; }

    [SitecoreField(FieldType = SitecoreFieldType.RichText)]
    public virtual string Testimony { get; set; }

    [SitecoreField]
    public virtual string Testifier { get; set; }

    [SitecoreField(FieldType = SitecoreFieldType.GeneralLink)]
    public virtual Link TestifierUrl { get; set; }

    [SitecoreField]
    public virtual string Company { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

[SitecoreType(TemplateName = "Testimonials")]
public class Testimonials : ContentFeatureItem
{
    public Testimonials()
    {
        TestimonialList = new List<Testimonial>();
    }

    [SitecoreQuery("/sitecore/content//*[@@templatename='Testimonial']", IsRelative = true)]
    public virtual IEnumerable<Testimonial> TestimonialList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

根据教程,我应该期望TestimonialList填充一个Testimonial项目列表.但是,列表始终为空.

我已经通过sitecore的Developer Tools中的XPath构建器以及Sitecore API的以下用法检查了路径是否有效.

var query = new Query("/sitecore/content//*[@@templateName='Testimonial']");
var returnVal = query.Execute();
Run Code Online (Sandbox Code Playgroud)

其中returnVal填充了预期的项目.我也尝试过./*[@@templateName='Testimonial']对映射属性的查询.

我已成功手动检索特定的推荐实例,以检查它是不是一些奇怪的映射问题.

抛开这个问题,Glass.Mapping.Sc和我的模型似乎都能正常工作.到目前为止,我已经按照glass.lu上的教程,我已经通过NuGet安装了Glass.Mapping.Sc.

我已经浏览了github上的源代码但看不到任何可能导致我问题的内容.有没有其他人有这个问题或成功使用玻璃查询填充参数?

更新(遵循Michael的回复):
我将以下属性添加到Testimonials类

[SitecoreQuery("./*")]
public virtual IEnumerable<AbstractModel> Children { get; set; }
Run Code Online (Sandbox Code Playgroud)

这返回了一个填充的IEnumerable的AbstractModel,它是6个Testimonial项目,它们是Testimonials项目的直接子项.

我也试过了

[SitecoreQuery("//*")]
public virtual IEnumerable<AbstractModel> Children { get; set; }
Run Code Online (Sandbox Code Playgroud)

并得到了相同的结果.我不明白那个,因为我希望得到更多的东西,而不仅仅是6个推荐书.

我删除了TestimonialList属性并添加了一个新属性Children,这个属性非常有效

[SitecoreQuery("./*[@@templatename='Testimonial']", IsRelative = true)]        
public virtual IEnumerable<Testimonial> Children { get; set; }      
Run Code Online (Sandbox Code Playgroud)

然后我使用resharper将属性重命名为TestimonialList,然后是ZYX,然后是Blerg.这三次都不起作用(没有填充),但是如果我重新命名为Child,一切都还可以.奇怪.

更多更新 我发现为什么当属性名为"Children"时查询似乎正在工作.它不起作用,这是我得到意想不到的结果的方式."儿童"是填充在所有子项目上的常见属性.因为我的所有子项都是推荐书,所以可以正确填充.

因此,如果我将我的属性更改为以下内容,它仍然正确填充

public virtual IEnumerable<Testimonial> Children { get; set; } 
Run Code Online (Sandbox Code Playgroud)

见于Glass.Mapper.Sc.Integration.DataMappers.SitecoreChildrenMapperFixture.MapToProperty_ItemHasThreeChildren_ThreeObjectsAreCreated.

Mic*_*rds 5

您的查询不是相对查询,因此您需要将属性更新为:

[SitecoreQuery("/sitecore/content//*[@@templatename='Testimonial']")]
public virtual IEnumerable<Testimonial> TestimonialList { get; set; }
Run Code Online (Sandbox Code Playgroud)

删除IsRelative意味着Glass将从解决方案的根目录进行查询.默认情况下,IsRelative标志为false.

IsRelative用于指示查询是否与Glass正在加载的当前项相关.例如,如果我有一个新闻登录页面,并且我想只获得具有功能标志的新闻页面的子项,我可以这样做:

[SitecoreQuery("./*[@featured='1']", IsRelative=true)]
public virtual IEnumerable<News> FeaturedNews { get; set; }
Run Code Online (Sandbox Code Playgroud)

我希望这解释了IsRelative标志的使用,如果它不让我知道,我会写一篇关于Glass网站的博客文章.