【问题标题】:Sitecore Glass Mapper (v3) for query based property not being populatedSitecore Glass Mapper (v3) 用于未填充基于查询的属性
【发布时间】:2013-09-04 20:12:34
【问题描述】:

更新:我使用的是 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。

【问题讨论】:

    标签: sitecore sitecore7 glass-mapper


    【解决方案1】:

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

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

    【讨论】:

    • 很抱歉给您带来了困惑。我首先尝试了一个相对路径“./*[@@templateName='Testimonial']”,正如我的帖子中其他地方所说的那样。我尝试将 IsRelative 设置为 true。使用 IsRelative false 和 true 尝试了完整路径,但均未成功。相对查询也不起作用。我还尝试使用非常通用的类型和开放的 Xpath 查询(例如“//*”)并返回我的基本模板类型,但这也不起作用。
    【解决方案2】:

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

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

    之后,一切正常。

    【讨论】:

    • 那么您不再有问题了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多