2015-09-17 3 views
4

Я не могу понять, почему стекло Mapper не может бросить объект в правильном пути, как описано here У меня есть следующие классыGlass Mapper v4 InferType Cast вопрос

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

по мнению бритвы я не могу получить AAA или объекты в, если я использую ребенок собственность,

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

что более интересно, если я использую вызов BBBCh или AAACh свойств при cshtml, я могу видеть (при отладке), что дети свойство содержит правильные элементы (объект), но если Я пытаюсь получить какой-либо предмет из Child property lik e

var detailWidget = Model.Children.FirstOrDefault(); 

оно будет передано классу WB. Что я могу с этим сделать?

+0

Эй .. это может быть решена с более новой версией стекла. Какую версию ты используешь? –

+1

Была ошибка с Glass v4, которая может быть тем, что вы видите. Он был исправлен с выпуском 4.0.1.5 - https://github.com/mikeedwards83/Glass.Mapper/issues/132 –

+0

Я видел эту проблему, но моя версия 4.0.1.8 –

ответ

3

У меня такая же проблема, с версией 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

У меня также был этот выпуск. Добавление этого к методу GlassLoaders GlassMapperScCustom по фиксированной для меня:

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

Добавление к конфигурации грузчики только установил ее с перерывами для меня. В принципе, в любое время, когда 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 
     }