1

更新:我使用的是 Sitecore 7.0 版

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

我有以下两种型号

[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 填充有 Testimonial 项目列表。但是,列表始终为空。

我已经通过使用 sitecore 的开发人员工具中的 XPath 构建器以及通过以下使用 Sitecore API 来检查路径是否有效。

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

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

我已经成功地手动检索了一个特定的 Testimonial 实例,以检查这不是一些奇怪的映射问题。

除了这个问题,Glass.Mapping.Sc 和我的模型似乎一切正常。到目前为止,我已经按照glass.lu上的教程进行操作,并且通过 NuGet 安装了 Glass.Mapping.Sc。

我查看了 github 上的源代码,但看不到任何可能导致我的问题的东西。有没有其他人遇到过这个问题或成功使用带有玻璃的查询填充参数?

更新(根据迈克尔的回复):
我在 Testimonials 类中添加了以下属性

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

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

我也试过

[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。所有三次都没有工作(没有填充),但如果我重命名回儿童,一切都很好。奇怪的。

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

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

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

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

4

2 回答 2

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 网站写一篇博客文章。

于 2013-06-19T06:42:55.957 回答
0

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

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

之后,一切正常。

于 2013-06-19T23:53:53.287 回答