Glass Mapper v4 InferType Cast 问题
Glass Mapper v4 InferType Cast issue
我不明白为什么 Glass Mapper 不能像描述的那样以正确的方式投射 object here
我有下一个 classes
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 objects
@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 属性 包含正确的项目 (object)但是如果我尝试从 Children 属性 中获取任何项目,例如
var detailWidget = Model.Children.FirstOrDefault();
它将转换为 WB class。
我可以用它做什么?
我遇到了完全相同的问题,版本是 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 循环,一些类型都是正确的,一些是 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
}
我不明白为什么 Glass Mapper 不能像描述的那样以正确的方式投射 object here 我有下一个 classes
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 objects @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 属性 包含正确的项目 (object)但是如果我尝试从 Children 属性 中获取任何项目,例如
var detailWidget = Model.Children.FirstOrDefault();
它将转换为 WB class。 我可以用它做什么?
我遇到了完全相同的问题,版本是 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 循环,一些类型都是正确的,一些是 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
}