我有一个如下设置
public class ProptsClass
{
public class ClassA
{
public list<ClassB> pcb { get; set; }
}
public class ClassB
{
public list<ClassC> pcc { get; set; }
}
public class ClassC
{
public string _someproperty { get; set; }
}
}
我想要做的是将对象ClassA数据绑定到ListView,其中一列被数据绑定到ClassC._someproperty。
当我尝试将其数据绑定为
<%#Eval("Namespace.ProptsClass.ClassA.pcb.pcc._someproperty") %>
我收到错误:“DataBinding:Namespace ProptsClass.ClassA + ClassB'不包含名为'_someproperty'的属性。”
有人可以告诉我我做错了什么,以及做正确的方法是什么。其次是有更好的方法可以在后面的代码而不是ASP.net中实现相同的功能。 提前致谢
答案 0 :(得分:4)
ListViews和GridViews上的DataBind仅对要绑定列的属性/字段名称进行“浅层”搜索。此外,它不会“压扁”您在结构中的列表列表。如果要绑定到多级对象模型,则需要通过“传递”属性在父级上公开子属性,或者将要显示的值投影到“视图”的一维集合中 - 帮助“上课。我会选择后者,因为你想要多维访问元素的价值。
试试这个:
var displayResult = theProptsClass.A.pcb.SelectMany(b=>b.pcc).Select(c._someproperty);
SelectMany()函数用于“展平”ClassB和ClassC之间的关系,并且与Select()结合将返回一个A中所有B中所有C的所有_someproperty值。您可以链接另一个SelectMany()调用如果你有一个As的集合,你需要从中收集Bs的平面集合。