Glass Mapper v4 InferType Cast issue

本文关键字:Cast issue InferType v4 Mapper Glass | 更新日期: 2023-09-27 18:13:09

我不明白为什么Glass Mapper不能像这里描述的那样以正确的方式投射对象我有下一个类

 public class BC
    {
        [SitecoreId]
        public virtual ID Id { get; set; }        
    }
public class WB : BC
    {
        [SitecoreField(FieldName = "P1")]
        public virtual Glass.Mapper.Sc.Fields.Link P1 { get; set; }
    }
 [SitecoreType(TemplateId = "{XXX}", AutoMap = true, EnforceTemplate = SitecoreEnforceTemplate.Template)]
    public class AAA : WB 
    {
        public virtual string AAAP1 { get; set; }
        public virtual DateTime AAAP2 { get; set; }
    }
 [SitecoreType(TemplateId = "{VVV}", AutoMap = true, EnforceTemplate = SitecoreEnforceTemplate.Template)]
public class BBB : WB 
    {
        public virtual string BBBp1 { get; set; }
        public virtual DateTime BBBp2 { get; set; }
    }
[SitecoreType(TemplateId = "{YYY}", AutoMap = true)]
    public class RazorRenderClass: BC
    {                      
        [SitecoreChildren(InferType = true)]
        public virtual IEnumerable<WB> Children { get; set; }
        [SitecoreChildren(InferType = true)]
        public virtual IEnumerable<AAA> AAACh { get; set; }
        [SitecoreChildren(InferType = true)]
        public virtual IEnumerable<BBB> BBBCh { get; set; }
    }

在razor视图下,我不能得到AAA或BBB对象如果我使用Children属性,

 @foreach (var child in Model.Children)
    {
        if (child is BBB)
        {
            var news = child as BBB;
            <li>
                11
            </li>
        }
        else if (child is AAA)
        {
            var evt = child as AAA;
            <li>
               222
            </li>
        }
    }
更有趣的是,如果我在cshtml中调用BBBCh或AAACh属性,我可以看到(在调试中)Children属性包含正确的项目(对象)但如果我试图从Children属性中获取任何项目,如
  var detailWidget = Model.Children.FirstOrDefault();

将强制转换为WB类。我可以用它做什么?

Glass Mapper v4 InferType Cast issue

我有完全相同的问题,版本4.0.5.54。

我的破解解决方案是将子类型指定为属性,就像您使用AAACh和BBBch一样。但是设置时不要延迟加载。

[SitecoreType(TemplateId = "{YYY}", AutoMap = true)]
public class RazorRenderClass: BC
{                      
    [SitecoreChildren(InferType = true, IsLazy = false)]
    public virtual IEnumerable<WB> Children { get; set; }
    [SitecoreChildren(InferType = true, IsLazy = false)]
    public virtual IEnumerable<AAA> AAACh { get; set; }
    [SitecoreChildren(InferType = true, IsLazy = false)]
    public virtual IEnumerable<BBB> BBBCh { get; set; }
}

我真的不喜欢指定,AAACh和BBBch作为属性。在glassmapper v3中,以下内容就足够了。

[SitecoreType(TemplateId = "{YYY}", AutoMap = true)]
public class RazorRenderClass: BC
{                      
    [SitecoreChildren(InferType = true)]
    public virtual IEnumerable<WB> Children { get; set; }
}

我也遇到过这个问题。将此添加到GlassMapperScCustom的GlassLoaders方法中为我修复了它:

return new IConfigurationLoader[]{ new AttributeConfigurationLoader("MyAssembly")};

添加配置加载器只能间歇性地修复它。基本上,每当w3wp循环时,有些类型是正确的,有些类型是城堡代理。

我想这是最新版本的错误。

我的解决方法是自己用代码重新绑定它:

protected List<ORM.IBaseModule> LocalModules;
protected void Page_Load(object sender, EventArgs e)
{
        var contextItem = Sitecore.Context.Item;
        var service = new SitecoreService(Sitecore.Context.Database.Name);
        LocalModules = new List<ORM.IBaseModule>();
        foreach (Item child in contextItem.Children)
        {
            if (child.TemplateID == ORM.AAAConstraints.TemplateId)
            {
                LocalModules.Add(service.Cast<ORM.AAA>(child));
            }
            //repeat for each type of child
         }