OnDataBinding vs Inline:优点,缺点和开销

时间:2009-03-31 18:08:38

标签: c# asp.net coding-style code-behind

我想我会问这个问题,看看为什么很多例子和人们更喜欢在aspx代码中使用内联数据绑定而不是在使用WebForms时实现OnDataBinding事件。

对于任何数据绑定控件(例如,Repeater,GridView等)我总是为字段级控件实现OnDataBinding方法,如果我需要做任何不是开箱即用的东西(例如,我需要做一个Eval)。我看到的大多数示例都使用内联<%#syntax。

在aspx页面中使用了正确的代码

内联ASP.NET代码示例:

<asp:Literal ID="litExample" runat="server"
    Text='<%# Eval("ExampleField").ToString() %>' />

我喜欢这样做的例子:

在aspx中:

<asp:Literal ID="litExample" runat="server" 
    OnDataBinding="litExample_DataBinding" />

在代码隐藏.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。它还可以采用所有类型的操作和代码来获取应存储在“Text”属性中的finally值。结束。

如果您使用内联代码,您在哪里绘制线并将其移动到代码隐藏?

这样做的优点和缺点是什么?

一个人比另一个人花费更多的开销吗?

编辑注意:我不是在为一个只在页面上的控件分配一个值,而是一个正在数据绑定的控件,因为它存在于转发器模板或gridview项目模板等中。 ..显然,你可以在代码中分配一个文字坐在页面上。

编辑注意:我以为我会收集更多回复,尤其是在开销方面。大多数人不使用OnDataBinding事件吗?

5 个答案:

答案 0 :(得分:8)

我更喜欢相反的情况。我更喜欢将代码隐藏在程序代码中,并将所有声明代码保存在我的Aspx页面中。在上面的示例中,文字绝对是声明性的,因此(根据我的偏好)不属于代码隐藏。更强大的功能通常出现在我的代码隐藏中,并且我不希望我的开发人员在尝试理解它时必须通过一堆初始化行进行筛选。

答案 1 :(得分:6)

它们之间的性能差异很小。解析数据绑定表达式并编译为类似

的表达式
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网格,完成了所有格式化,然后发现我需要能够在朗姆时设置格式(以便将正确的格式导入导出的Excel文件)。为了做到这一点,我打开了源文件(所有网格都在一个用户控件中),并且能够将每个网格的配置提取到一组单独的方法中。

我能够用ReSharper清理它们,将公共代码序列提取到基类中,并留下一个静态方法来设置每个网格。然后,我可以将它们称为初始设置,以及用于Excel导出的虚拟网格的设置。

答案 2 :(得分:1)

我喜欢用OnDataBinding方式。您可以通过对所有OnDataBinding调用使用“Databind”区域来保持代码隐藏清晰,并且可以通过将那些可怕的服务器端代码块放在那里来保持标记清洁。

我认为大多数人都采用内联方式,因为它更容易理解和实施。

答案 3 :(得分:0)

实际上我更喜欢将aspx用于你期望绑定的控件,比如listview,gridview,repeater和其他类似的控件。

对于其他控件,我会在代码隐藏中设置它们,但是直接(作为我正在进行的过程的一部分,而不是为整个页面调用literal.DataBind或DataBind)。如果它是用户/自定义控件,我希望调用者执行DataBind,那么我将覆盖DataBind并设置值。

也就是说,我通常在代码隐藏之外有很多代码,并且调用ShowUser之类的东西,在那里我将这些赋值放到控件上(而不是设置属性,然后进行绑定,并拥有所有这些用于简单的控制)。

答案 4 :(得分:0)

我同意caltrop。我喜欢我的标记是干净的,所有我的aspx / ascx代码都驻留在我的代码隐藏文件中(它所属的位置)。

我只有一件事要补充。我更喜欢不使用为每个数据绑定控件连接的OnDataBinding()事件来丢弃我的代码。相反,我在嵌入在可绑定控件中的用户控件的OnDataBinding()事件中完成所有操作(例如示例中的转发器)。

例如,在我的User Control的代码隐藏中,您会发现:

protected override void OnDataBinding(EventArgs e)
{
    base.OnDataBinding(e);

    litExample.Text = Eval("ExampleField") + " - " + Eval("ExampleField2");
}

从这里,您可以设置所有控件的属性,或调用其他方法来设置它们。请注意,在我的示例中,我不需要像您在此处执行的那样执行拳击:Literal lit = (Literal)(sender);

仅此一项就可以为您节省一些性能(当然是纳秒,但值得一试)。请在此处阅读“效果”部分:http://msdn.microsoft.com/en-us/library/yz2be5wk%28v=vs.80%29.aspx

我也在代码中使用字符串。我会使用const字符串变量来定义“ExampleField”和“ExampleField2”,或者将它们设置为用户控件中的公共属性,然后可以由包含控件/页面根据数据对象的列名设置它。受到约束。这提供了更多的灵活性和控制的重复使用。

仅供参考:您不需要在Eval上调用ToString(),因为此方法已经返回一个字符串。