Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnDataBinding与Inline:优点、缺点和开销_C#_Asp.net_Coding Style_Code Behind - Fatal编程技术网

C# OnDataBinding与Inline:优点、缺点和开销

C# OnDataBinding与Inline:优点、缺点和开销,c#,asp.net,coding-style,code-behind,C#,Asp.net,Coding Style,Code Behind,我想我会问这个问题,看看为什么很多示例和人们喜欢在aspx代码中使用内联数据绑定,而不是在使用WebForms时实现OnDataBinding事件 对于任何数据绑定控件(如中继器、GridView等)如果我需要执行任何不是现成内置的操作(如我需要执行评估),我总是为字段级控件实现OnDataBinding方法。我看到的大多数示例都在aspx页面中使用内联代码,我更喜欢相反的方式。我更喜欢将我的代码限制在过程代码中,并将所有声明性代码保留在我的Aspx页面中。在上面的示例中,文本是绝对声明性的,因

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


对于任何数据绑定控件(如中继器、GridView等)如果我需要执行任何不是现成内置的操作(如我需要执行评估),我总是为字段级控件实现OnDataBinding方法。我看到的大多数示例都在aspx页面中使用内联代码,我更喜欢相反的方式。我更喜欢将我的代码限制在过程代码中,并将所有声明性代码保留在我的Aspx页面中。在上面的示例中,文本是绝对声明性的,因此(根据我的偏好)不属于代码隐藏。我的代码中通常包含更强大的功能,我不想让我的开发人员在试图理解它时因为必须筛选一大堆初始化行而感到混乱。

实际上,我更喜欢将aspx用于您希望绑定的控件,如listview、gridview、repeater和其他类似控件

对于其他控件,我将直接在codebehind中设置它们(作为我正在执行的过程的一部分,而不是为整个页面调用literal.DataBind或DataBind)。如果它是一个用户/自定义控件,我希望调用方执行数据绑定,那么我将重写数据绑定并设置值


这就是说,我通常有很多代码在codebehind之外,并调用ShowUser之类的东西,在那里我将这些分配放在控件上(而不是设置属性,然后进行绑定,并对简单控件进行所有这些求值)。

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

control.DataBinding += new EventHandler(ControlDataBinding);
而且

private void ControlDataBinding(object sender, EventArgs e) {
    control.Text = Eval("Field");
}
在这种情况下,不会重写OnDataBinding方法。执行base Control.OnDataBinding方法,该方法引发数据绑定事件,导致执行上述代码

当您重写OnDataBinding时,您只是在运行基本代码之前接管,然后自己设置
Text
属性(例如)


我不喜欢给出部分答案,但这次我会这样做,因为我觉得它很整洁,而且它最近救了我一命:

我说过数据绑定表达式是解析的。事实上,所有的标记都会被解析,用C#、VB.NET或任何语言生成的代码都会被编译成一个类。当请求页面时,将创建该类的一个实例,并开始其生命周期

您可以在磁盘上找到这些生成的代码文件。对不起,我不记得在哪里。有趣的是,它们仍然可以作为代码工作

例如,我最近设置了一些相当复杂的基础设施网格,完成了所有格式设置,然后发现我需要能够同时设置格式(以便将正确的格式导入导出的Excel文件)。为了做到这一点,我打开了源文件(所有网格都在一个用户控件中),并能够将每个网格的配置提取到一组单独的方法中


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

我更喜欢使用OnDataBinding的方式。您可以通过为所有OnDataBinding调用使用一个“Databind”区域来保持codebehind的干净,也可以通过将那些可怕的服务器端代码块从其中取出来保持标记的干净


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

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

我只有一件事要补充。我不喜欢在代码中为每个数据绑定控件连接OnDataBinding()事件。相反,我在用户控件的OnDataBinding()事件中完成了这一切,用户控件嵌入到bindable控件中(例如示例中的repeater)

例如,在我的用户控件背后的代码中,您会发现:

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

    litExample.Text = Eval("ExampleField") + " - " + Eval("ExampleField2");
}
从这里您可以设置所有控件的属性或调用其他方法来设置它们。注意,在我的示例中,我不需要像这里那样执行装箱:
Literal lit=(Literal)(sender)

仅此一项就可以为您节省一些性能(当然是纳秒,但值得衡量)。请阅读此处的“性能”部分:

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


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

+1,我也会这样做。代码隐藏最多可能包含用于常用格式(例如,将bool格式设置为Yes/No而不是True/False)的帮助器方法,然后从标记中的数据绑定表达式调用这些方法。以上是最基本的示例。你在哪里划界?我看不出有必要划界。任何声明性、完全静态或仅初始化的代码都会放入Aspx文件中;或者((int)(Eval(“某物”)==1)?“是”:“否”;等这就是我对这行的意思,当你把它从aspx移到codebehind时……这比我在aspx文件中放的一些东西要简单得多:)就像我说的,这类东西是简单的、静态的、初始化代码,我不希望我的团队永远使用它
control.DataBinding += new EventHandler(ControlDataBinding);
private void ControlDataBinding(object sender, EventArgs e) {
    control.Text = Eval("Field");
}
protected override void OnDataBinding(EventArgs e)
{
    base.OnDataBinding(e);

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