10

多くの例や人々が、Web フォームを使用するときに OnDataBinding イベントを実装するのではなく、aspx コードでインライン データ バインディングを使用することを好む理由を確認するために、この質問をすると思いました。

データバインドされたコントロール (例: Repeater、GridView など)の場合、すぐに使えるように組み込まれていないことを行う必要がある場合 (例: Eval を実行する必要がある場合)、フィールド レベル コントロールの OnDataBinding メソッドを常に実装します。私が目にするほとんどの例では、インライン <%# 構文を使用して 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());
}

私は個人的に分離コード方式を好みます。これにより、aspx ページがクリーンに保たれ、このインライン コードがあちこちにあるわけではなく、次の人はコードの変更を常に .cs ファイルで確認することを知っているからです。HTML はプレースホルダーのみであり、codebind は実際に何を制御するかを決定するため、プレゼンテーションとコードの分離もこの方法でより適切に維持されます。

これらは非常に基本的な例です。フィールドは、先頭に 0 を付けてフォーマットする整数、または特定のフォーマットが必要な DateTime などにすることができます。「Text」プロパティに格納する必要がある最終値を取得するために、あらゆる種類の操作とコードが必要になる場合もあります。終わり。

インライン コードを使用している場合、どこに線を引いてコード ビハインドに移動しますか?

どちらの方法で行う場合の長所と短所は何ですか?

一方が他方よりも多くのオーバーヘッドを必要としますか?

編集注:ページ上にあるコントロールに値を割り当てることについて話しているのではありませんが、リピーターテンプレートまたはグリッドビューアイテムテンプレートなどに存在するため、データバインドされているコントロールに値を割り当てることについては話していません...明らかに、あなたがページに座っているリテラルコードで割り当てることができます。

編集注:特にオーバーヘッドに関しては、より多くの応答を収集すると思いました。ほとんどの人は OnDataBinding イベントを使用しませんか?

4

5 に答える 5

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 ファイルに正しい書式を取得するため)。これを行うために、ソース ファイルを開き (すべてのグリッドが 1 つのユーザー コントロールに含まれていました)、各グリッドの構成を個別のメソッド グループに抽出することができました。

ReSharper でそれらをクリーンアップし、共通のコード シーケンスを基本クラスに抽出し、各グリッドをセットアップするための 1 つの静的メソッドを残すことができました。その後、初期セットアップと、Excel エクスポートに使用されるダミー グリッドのセットアップの両方で、それらを呼び出すことができました。

于 2009-07-18T19:33:12.620 に答える
1

私は OnDataBinding であなたのやり方を好みます。すべての OnDataBinding 呼び出しに「Databind」領域を使用することでコード ビハインドをクリーンに保つことができ、そこからサーバー側の恐ろしいコード ブロックを取り除くことでマークアップをクリーンに保つことができます。

理解しやすく、実装しやすいため、ほとんどの人はインラインで行うと思います。

于 2010-03-02T20:32:59.627 に答える
0

私はcaltropに同意します。マークアップをクリーンにし、すべての aspx/ascx コードをコード ビハインド ファイル (それが属する場所) に配置するのが好きです。

一つだけ付け加えておきたいことがあります。私は、データバインドされた各コントロールに関連付けられた OnDataBinding() イベントをコードに散らかしたくないと考えています。代わりに、バインド可能なコントロール (サンプルのリピーターなど) に埋め込まれているユーザー コントロールの OnDataBinding() イベントですべてを行います。

たとえば、ユーザー コントロールのコード ビハインドには次のようなものがあります。

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() を呼び出す必要はありません。

于 2011-01-24T06:22:32.863 に答える
0

実際には、リストビュー、グリッドビュー、リピーター、その他の同様のコントロールなど、バインドすることが期待されるコントロールには aspx を使用することを好みます。

他のコントロールについては、コード ビハインドで直接設定します (ページ全体に対してliteral.DataBind または DataBind を呼び出す代わりに、実行中のプロセスの一部として)。呼び出し元が DataBind を実行することを期待するユーザー/カスタム コントロールの場合は、DataBind をオーバーライドして値を設定します。

とは言っても、私は通常、コードビハインドの外にたくさんのコードを持っており、ShowUser のようなものを呼び出して、これらの割り当てをコントロールに配置します (プロパティを設定してからバインドを実行し、単純なコントロールのすべての評価を行うのではなく)。 .

于 2009-03-31T18:29:59.563 に答える