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

时间:2013-06-19 05:17:29

标签: 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; }

}

[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; }
}

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

我已经检查过该路径是有效的,既可以使用sitecore的Developer Tools中的XPath构建器,也可以使用Sitecore API的以下用法。

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

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

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

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

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

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

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

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

我也试过

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

并得到了相同的结果。我不明白那个,因为我希望得到的东西比6个推荐书多得多。

我删除了TestimonialList属性并添加了一个新属性Children,这个属性完美地运行

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

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

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

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

public virtual IEnumerable<Testimonial> Children { get; set; } 

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

答案 1 :(得分:0)

我发现了我的问题(花了几个小时搜索Glass Mapper源码 - 至少我学到了一些关于Glass Mapper的东西:))。我重新命名了我的程序集,我没有更改传递给{{SitecoreAttributeConfigurationLoader}}的名称。

一旦我更改了这个名字,我仍然无法让它工作,所以我从我的bin文件夹中删除了旧的dll,重新启动了PC并在桌子周围跳了几次呗工作!工作!工作!一遍又一遍(好吧,最后一点被编造)。

之后,一切正常。