更新:我正在使用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。
答案 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并在桌子周围跳了几次呗工作!工作!工作!一遍又一遍(好吧,最后一点被编造)。
之后,一切正常。