【问题标题】:Glass Mapper v4 InferType Cast issueGlass Mapper v4 InferType Cast 问题
【发布时间】:2015-09-17 19:28:56
【问题描述】:

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

 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; }
    }

在剃刀视图中,如果我使用 Children 属性,我无法获得 AAA 或 BBB 对象,

 @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 可能已经解决了这个问题。你用的是什么版本?
  • Glass v4 存在一个错误,这可能就是您所看到的。它已在 4.0.1.5 版中修复 - github.com/mikeedwards83/Glass.Mapper/issues/132
  • 我看到了这个版本问题,但我的版本是 4.0.1.8
  • 您是否在 GlassMapperScCustom.cs 的 GlassLoaders 中注册了您的程序集?
  • @Arbejdsglæde 在您的 GlassMapperScCustom.cs GlassLoaders 方法中添加以下内容 - return new IConfigurationLoader[]{ new AttributeConfigurationLoader("[YOUR ASSEMBLY NAME"), };

标签: c# sitecore glass-mapper sitecore-mvc


【解决方案1】:

我遇到了完全相同的问题,版本为 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; }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      添加配置加载器只是间歇性地为我修复它。基本上,只要 w3wp 循环,有些类型是正确的,有些是 Castle Proxies。

      我认为这是最新版本中的一个错误。

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

      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
               }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多