【发布时间】:2015-10-14 18:12:34
【问题描述】:
在 Sitecore 中,我有 2 个类代表 2 个可能的节点,这些节点可以作为另一个节点的子节点存在。
我的模型包含一个 Children 属性,它是一个 IEnumerable
基本上在剃须刀视图中(从 GlassView 继承,我循环遍历 INode 子项的集合并调用 .GetType() 来识别底层类。但我没有获得正确的类型,而是获得了 IColumnProxy 类型,这是动态的代理玻璃映射器用于创建视图模型。
有没有办法获取实际类型而不是动态代理? 谢谢
编辑:这是代码示例:
public interface INode {}
[SitecoreType(TemplateId = "AAAAAAAAA", AutoMap = true)]
public Class NodeType1 : INode
{
public string PropertyA { get; set; }
}
[SitecoreType(TemplateId = "BBBBBBB", AutoMap = true)]
public Class NodeType2 : INode
{
public string PropertyB { get; set; }
}
[SitecoreType(TemplateId = "CCCCCCC", AutoMap = true)]
public class SitecoreItem
{
[SitecoreChildren(InferType=true)]
public virtual IEnumerable<INode> Nodes { get; set; }
}
在剃刀视图中:
@foreach(var node in item.Nodes)
{
var type = node.GetType(); //INodeProxy
var isNode1 = node is NodeType1; //False
var isNode2 = node is NodeType2; //False
var baseType = node.GetType().BaseType; //DynamicProxy
}
项目中的引用是 Glass.Mapper 和 Glass.Mapper.Sc
编辑:更新 1
好吧,在深入研究之后,GlassMapper 似乎按照我应该的方式进行操作,但由于某种原因,它在我的特定情况下不起作用。 我错过了什么?参考文献?
【问题讨论】:
-
你尝试
if (node is MyType)而不是调用GetType()? glass.lu/Mapper/Sc/Tutorials/Tutorial17 -
是的,我做到了,但它不起作用,因为接口实现被代理隐藏了
-
是的。这就是 GlassMapper 所做的 - 它通过 Castle Windsor 生成自己的接口实现。
-
我建议您检查每个对象是否实现了某个接口,而不是检查具体类型 - 前提是子项具有 2 个不同的 Sitecore 模板。
标签: c# razor sitecore castle-dynamicproxy glass-mapper