(我使用Sitecore 8.1更新3与Glass Mapper.Sc版本4.1.1.66)
我遇到了一个问题,即Sitecore项目的某些属性没有通过Glass Mapper填充代码。我们的内容基础项目(ID,名称,显示名称,典型的Sitecore字段)中的值似乎正在正确填充,但子项目的字段(我称之为概述)不是完全映射。它们都是所有字符串但它们都以null结尾,即使Content Base的值看起来是正确的。我们还有相同的其他区域中的子类映射,因此这可能不是原因。
在此项目的早期,我们遇到了Glass Mapper的问题,其中包含空格的字段名称未被读取。但是,我确保在字段名称中留出任何空格,但这并不能解决问题。
该问题的另一个可能的贡献者是我们在网站上有多种语言,因此可以想象语言回退可能使事情变得复杂。但是,我们已启用后备功能并在整个网站上正常运行而没有任何问题。
我可以根据需要发布代码,但在大多数情况下,它只是POCO和映射类。
关于我应该研究的其他部分的任何想法?
答案 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代码,看看我是否可以找到答案。但是现在我知道那里有问题,我可以避免它。