对于任何数据绑定控件(例如Repeater,GridView等),如果我需要做任何不是开箱即用的东西(例如,我需要做一个Eval),我总是为Field级别的控件实现OnDataBinding方法.我看到的大多数示例都使用内联<%#语法在aspx页面中使用代码. 内联ASP.NET代码示例:
<asp:Literal ID="litExample" runat="server" Text='<%# Eval("ExampleField").ToString() %>' />
我如何喜欢这样做的例子:
在aspx中:
<asp:Literal ID="litExample" runat="server" OnDataBinding="litExample_DataBinding" />
在codebehind .cs:
protected void litExample_DataBinding(object sender,System.EventArgs e) { Literal lit = (Literal)(sender); lit.Text = string.Format("{1} - {2}",Eval("ExampleField").ToString(),Eval("ExampleField2").ToString()); }
我个人更喜欢codebehind方法,因为它保持我的aspx页面清洁,我没有所有的这个内置的代码遍布整个地方,下一个人只是知道总是在.cs文件中查看代码更改.演示和代码的分离也以这种方式保持更好,因为HTML只是占位符,代码绑定正在确定实际被控制的内容.
现在这些是非常基本的例子.该字段可以是您要使用前导0或需要特定格式的DateTime进行格式化的整数.还可以使用所有类型的操作和代码来获取应存储在“文本”属性中的最终值结束.
这样做的优点和缺点是什么?
一个比另外一个需要更多的开销?
编辑注意:我不是在将一个值分配给一个刚刚在页面上的控件,而是一个数据绑定的控件,因为它存在于一个中继器模板或gridview项目模板等中.显然,一个文字坐在一个页面上可以在代码中分配.
编辑注意:我以为我会收集更多的回应,特别是在开销上.大多数人不会使用OnDataBinding事件?
解决方法
control.DataBinding += new EventHandler(ControlDataBinding);
并且
private void ControlDataBinding(object sender,EventArgs e) { control.Text = Eval("Field"); }
在这种情况下,OnDataBinding方法不会被覆盖.执行基本的Control.OnDataBinding方法,这引发了DataBinding事件,导致上述代码执行.
当您重写OnDataBinding时,您只需要在运行基础代码之前接管,并自己设置Text属性(例如).
我不喜欢提供部分答案,但我会这样做,因为我认为它很整洁,最近救了我:
我说数据绑定表达式被解析.事实上,所有的标记都被解析,C#中的代码,VB.NET或者任何一种语言被生成,这被编译成一个类.当请求页面时,将创建此类的实例,并开始生效.
你可以在磁盘上找到这些生成的代码文件对不起,我不记得在哪里了.他们的有趣的事情是,他们仍然工作,作为代码.
例如,我最近有一些相当复杂的Infragistics网格设置,所有格式完成,然后发现我需要能够设置rumtime的格式(以获得正确的格式到导出的Excel文件).为了做到这一点,我打开了源文件(所有网格都在一个用户控件中),并且能够将每个网格的配置提取到一组单独的方法中.
我可以用ReSharper清理它们,将常见的代码序列提取到一个基类中,并留下一个静态方法来设置每个网格.然后我可以调用它们进行初始设置,以及用于Excel导出的虚拟网格的设置.