Glass Mapper不映射某些项属性

时间:2016-10-31 21:02:04

标签: sitecore sitecore8 glass-mapper sitecore8.1

(我使用Sitecore 8.1更新3与Glass Mapper.Sc版本4.1.1.66)

我遇到了一个问题,即Sitecore项目的某些属性没有通过Glass Mapper填充代码。我们的内容基础项目(ID,名称,显示名称,典型的Sitecore字段)中的值似乎正在正确填充,但子项目的字段(我称之为概述)不是完全映射。它们都是所有字符串但它们都以null结尾,即使Content Base的值看起来是正确的。我们还有相同的其他区域中的子类映射,因此这可能不是原因。

在此项目的早期,我们遇到了Glass Mapper的问题,其中包含空格的字段名称未被读取。但是,我确保在字段名称中留出任何空格,但这并不能解决问题。

该问题的另一个可能的贡献者是我们在网站上有多种语言,因此可以想象语言回退可能使事情变得复杂。但是,我们已启用后备功能并在整个网站上正常运行而没有任何问题。

我可以根据需要发布代码,但在大多数情况下,它只是POCO和映射类。

关于我应该研究的其他部分的任何想法?

2 个答案:

答案 0 :(得分:1)

您需要使用VersionCountDisabler(),您可以在此previous question和此blog post中找到有关它的更多详细信息。

在Sitecore 8.1和使用语言回退时,禁用程序的使用不是supposed to be required,但我可以确认这是一个问题,使用VersionCountDisabler()解决了我们的问题。

内部玻璃将检查项目的版本是否存在,如果不存在则返回null。似乎Sitecore将返回带有布局的项目的版本计数,但不会返回数据源项目的版本计数。

我们已将禁用程序与使用global.asax文件略有不同,而是修补到http请求管道:

using Glass.Mapper.Sc;
using Sitecore.Pipelines.HttpRequest;

namespace MyProject.Custom.Pipelines.HttpRequest
{
    public class ItemVersionCountDisablerBegin : HttpRequestProcessor
    {
        public override void Process(HttpRequestArgs args)
        {
            Sitecore.Context.Items["Glass::VersionCountDisabler"] = new VersionCountDisabler();
        }
    }

    public class ItemVersionCountDisablerEnd : HttpRequestProcessor
    {
        public override void Process(HttpRequestArgs args)
        {
            VersionCountDisabler disabler = Sitecore.Context.Items["Glass::VersionCountDisabler"] as VersionCountDisabler;
            Sitecore.Context.Items["Glass::VersionCountDisabler"] = null;
            disabler?.Dispose();
        }
    }
}

然后将其修补为http请求开始和结束管道:

<pipelines>
  <httpRequestBegin>
    <processor type="MyProject.Custom.Pipelines.HttpRequest.ItemVersionCountDisablerBegin, MyProject.Custom" patch:before="*[1]"/>
  </httpRequestBegin>
  <httpRequestEnd>
    <processor type="MyProject.Custom.Pipelines.HttpRequest.ItemVersionCountDisablerEnd, MyProject.Custom" />
  </httpRequestEnd>      
</pipelines>

答案 1 :(得分:0)

经过一些实验,我找到了问题的原因。

在我的地图类中,您会看到以下这一行:

config.Field(f => f.HeaderPrefix).FieldName("AssetOverviewContentHeaderPrefix");

字段名称似乎有点长,对吧?我们将类别名称添加到字段名称之前,以避免项目中存在任何重复的名称,因为我们进行了大量的继承。

问题出在哪里。当我删除&#34; AssetOverviewContent&#34;从字段名称来看,一切正常。基于此,我做了一些实验。

我发现长达23个字符的字段名称工作正常。 24或更多,他们不会映射。我不知道为什么这个数字特别是限制,但我的猜测是某些其他地图正在某个地方达到极限。

更多的实验也发现使用FieldId进行映射也不起作用。 Guids的长度超过23个字符,这样才有意义。但是,你不能在不到23个字符的情况下真正做一个guid,所以我无法确认。

我可能很快就会查看Glass Mapper代码,看看我是否可以找到答案。但是现在我知道那里有问题,我可以避免它。