repeater绑定泛型list<string>
菜鸟D重出江湖,依然是菜鸟,囧!言归正传——
工作中遇到一个repeater绑定的问题,数据源是一个list<string> 集合,然后在界面上使用<%#Eval()%>绑定。问题来了,Eval该绑定那个属性名(或者字段)呢?
先说菜鸟D的想法:将list<string>变成list<匿名> ,然后绑定匿名类型的某一属性。菜鸟为啥会有这样的想法,首先list<string>只用一次,而且只有一个属性(字段),没有必要新声明一个类型,匿名就可以胜任,反正我们更关心的是属性(字段)而不是类型。其次,你不觉得写一个匿名集合有够高大上么?!
菜鸟D开始了尝试,用脚趾也能想出来结果,失败—— 理由:声明集合不能使用匿名类型(有高人不服可以尝试,欢迎提供新的解决方法,总之菜鸟D没有写出来)
然后有位朋友提示可以使用动态dynamic(自行脑补),于是乎,菜鸟D搞出来一个动态集合(这个貌似会敲代码都会写吧),动态集合里随意插入,没人在意是什么类型,当然集合里类型是一致的,你总不能插一个int,再插一个string吧。此时匿名就派上用场了。
List<dynamic> list = new List<dynamic>(); list.Add(new { Name = "1" }); list.Add(new { Name = "2" });
这时候绑定就没有问题了,Eval也可以找到合适的属性(字段)来绑定了。这种方法就是采用匿名类型+动态集合来绑定的,硬生生把string变成一个实体类,想想也没必要。
然后在网上找个下,还真找到类似的情况,博问里边还给出了解决方案。
<%# ((string)Container.DataItem)%>
就是这么简单,你不用考虑什么实体类。菜鸟D只能拜服:高人啊!
这个问题提供了两种解决方案,哪一种更适合就选哪一种呗。不过菜鸟D感觉动态集合+匿名类型只是在这里不是最佳方案,一定有更适合的地方。不足之处,欢迎指正。
-------------------------------------------------------------------------------------
菜鸟D希望这篇文字能够帮到你。
下面内容属于基础知识科普:
匿名类型:匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。注意:属性是只读的,也就是说匿名类型适合展示。由于属性只读,赋值什么的就不要想了,编译不通过的。匿名类型更多的使用于linq语句中。
var v = new { Amount = 108, Message = "Hello" }; Console.WriteLine(v.Amount + v.Message);
动态类型dynamic(csdn上为使用类型): 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。
在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型。在显式类型转换中,作为转换的目标类型。在以类型充当值(如 is 运算符或 as 运算符右侧)或者作为 typeof 的参数成为构造类型的一部分的任何上下文中。
dynamic在mvc中使用的更多,也有人说它与js的var很像(当然指用法)。经常与 ExpandoObject 一起使用,常用mvc的人应该简单比较多。