在标记中将数据绑定到转发器或以编程方式绑定它之间的区别是什么

时间:2011-03-04 04:02:06

标签: c# asp.net

在两种情况下绑定例如名为(“名称”)的列之间的区别是什么?并且有任何性能差异吗?

1-在标记中分配数据

<asp:Label ID="Name_Lbl" runat="server" Text='<%# Eval("Name") %>' ></asp:Label>

2-为转发器ItemTemplate中的每个控件定义一个控制对象并找到它,然后将“Name”列中的数据分配给它

e.Item.FindControl("Name_Lbl")

2 个答案:

答案 0 :(得分:4)

您可能会得到相同的结果,但性能可能会有所不同。数据绑定表达式(Eval)使用引擎下的反射来绑定数据,而FindControl将向上走控制树以找到必要的控件。反射确实有一些性能成本(取决于你查找了多少属性/名称,虽然一旦查找了一个有效的描述符确实被缓存)。另一方面,控制树行走的开销将取决于控制树的深度。

IMO,数据绑定语法更优雅,我更喜欢 - 性能必须以相对的术语来看 - 与总请求时间相比,我花费了多少额外费用,因此与其他活动相比,数据绑定成本可以忽略不计实际上是获取数据。说数据绑定存在变化以避免反射 - 请参阅http://weblogs.asp.net/jgalloway/archive/2005/09/20/425687.aspx

很多时候,我使用代码隐藏属性来提供强类型属性以便于使用。例如,当repeater与实体类ProductDetails的数组/列表/枚举绑定时,在代码隐藏中,我使用的方法如

protected ProductDetails GetProduct(RepeaterItem container)
{
   return (ProductDetails)container.DataItem;
}

在加价中,

<asp:Label ID="Name_Lbl" runat="server" Text='<%# GetProduct(Container).Name %>' ></asp:Label>

更不用说你使用GetProduct(Container)进行intellisense处理它的字符串类型

答案 1 :(得分:0)

没有区别,.NET在后端创建了相同的ControlTree。本文解释了编译期间ASP.NET的内幕。这是一篇较旧的文章但相关。

Compilation and Deployment in ASP.NET 2.0