4

aspx ページで常に次のようなコードに出くわします。

<asp:CheckBox Runat="server" ID="myid" Checked='<%# DataBinder.Eval(Container.DataItem, "column").Equals(1) %>'>

I was wondering what other objects I have access to inside of that <%# %> tag. How come DataBinder.Eval() and Container.DataItem are not visible anywhere inside .CS code?

4

6 に答える 6

8

アクセスできる <%# %> タグ内

  1. コード ビハインド クラスで表示されるすべてのもの (保護されたメソッドとプロパティを含む)。
  2. <@import @> を使用して aspx ページで宣言されたもの。
  3. ItemDataBound イベントが発生したときにイベント引数として渡されたもの (例: RepeaterItemEventArgs、DataListItemEventArgs など)。

Containerは、実際には RepeaterItemEventArgs.Item、DataListItemEventArgs.Item などのラッパーです。そのため、ItemDataBound イベント内のコード ビハインドでe.Itemとして実際にアクセスできます(e は通常、イベント引数パラメーター名です)。

DataBinderは、 System.Web.UI.DataBinderを使用してコード ビハインドからもアクセスできます。

ちなみに、Container.DataItem のキャストは、Eval を使用するよりも優先されます。Eval はリフレクションを使用するため、そこにオーバーヘッドがあります。VB.NETでは、次のようになります

<%#DirectCast(Container.DataItem, DataRow)("some_column")%>

または C#

<%#((DataRow)Container.DataItem)["some_column"].ToString()%>
于 2008-10-09T01:37:54.087 に答える
1

<%# は、投稿されたリンク ckramer が示唆するように、インライン ASPX データバインディングに固有です。

DataBinder.Eval() と Container.DataItem が .CS コード内のどこにも表示されないのはなぜですか?

コードビハインドでバインド項目にアクセスするには、 ItemDataBoundイベントを設定する必要があります。

于 2008-10-09T01:31:55.347 に答える
1

良い例

<%#((System.Data.DataRow)Container.DataItem)["ColumnName"].ToString()%>
于 2009-08-17T12:13:23.310 に答える
1

式の結果は文字列に変換されますが、ページ クラスの範囲内であれば何でもアクセスできると思います。そのため、「<%」式の穴のように条件式を埋め込むことはできません。

これは、生成されたASPXクラスの内部に飛び込む素敵なブログ投稿です。

お役に立てれば。

于 2008-10-09T01:12:58.613 に答える
1

ASP.NET は、テンプレートが出現するたびにTemplateControlのサブクラスを生成します。データバインディング ステートメントは、そのクラス内のメソッドで使用される式です。したがって、TemplateControl で任意の public/protected インスタンス メソッドを呼び出すことができます。XPath および XPathSelect メソッドを使用するため、XPath を使用するを参照してください。Eval、XPath、および XPathSelect はすべて、TemplateControl のインスタンス メソッドです。

DataBinderは実際には別のクラスであり、Eval はその public static メソッドです。System.Web.UI にあります。DataBinder.Eval と単純な Eval は、目に見えて非常によく似た動作をしますが、直接関係はありません。

「コンテナ」は実際には、データバインディングステートメントがコンパイルされるローカル変数またはパラメーターであると思います。現時点ではそのタイプを思い出せません。

于 2008-10-09T01:52:46.303 に答える
1

<%# %>実際に使用するということは、page.DataBind()メソッドが実行されているときにこのブロック内のコードが実行されることを意味します。したがって、その時点で、その特定のページ/コントロールに対して保護/パブリックとしてアクセスできるものにアクセスできます。

于 2009-08-17T12:25:59.087 に答える