データ連結式構文
データ連結式は、ASP.NET ページ上で DataBind メソッドが呼び出されたときに、サーバー コントロール プロパティなどの ASP.NET ページ上の任意のプロパティとデータ ソースとの連結を行います。データ連結式は、サーバー コントロールの開始タグ内またはページの任意の場所で、属性と値のペアの右辺に記述できます。
<tagprefix:tagname property="<%# data-binding expression %>"runat="server" />
または
literal text<%#data-bindingexpression%>
属性
- property
データ連結を宣言する対象となるコントロール プロパティ。 - data-binding expression
次に示す解説のセクションで概説する要件を満たす任意の式。
解説
すべてのデータ連結式は、それを配置する場所にかかわらず、文字列 <%# および %> で囲む必要があります。
ASP.NET では、サーバー コントロール プロパティと親データ ソースを関連付けて連結できる階層データ連結モデルがサポートされます。すべてのサーバー コントロール プロパティは、そのコンテナ ページ、またはサーバー コントロールの直接の名前付けコンテナのすべてのパブリックなフィールドまたはプロパティに対してデータ連結できます。
DataBinder.Eval の使用
ASP.NET には、遅延連結のデータ連結式を評価し、オプションで結果を文字列として書式指定する、DataBinder.Eval という静的メソッドが用意されています。このメソッドを使用することで、値を必要なデータ型に強制的に変換するために必要な明示的キャストの大部分が不要になります。
たとえば、次のコードでは、整数が通貨文字列として表示されます。標準の ASP.NET データ連結構文では、IntegerValue
データ フィールドを取得するために、最初にデータ行の型をキャストする必要があります。次に、このフィールドが String.Format メソッドへの引数として渡されます。
<%# String.Format("{0:c}", ((DataRowView)Container.DataItem)["IntegerValue"]) %>
この構文と、引数がデータ項目の名前付けコンテナ、データ フィールド名、および書式指定文字列の 3 つだけの DataBinder.Eval の構文とを比較します。DataList クラス、DataGrid クラス、Repeater クラスなどの template 宣言されたリストでは、名前付けコンテナは常に Container.DataItem です。
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
書式指定文字列引数はオプションです。これを省略すると、次の例のように、DataBinder.Eval は型オブジェクトの値を返します。
<%# (bool)DataBinder.Eval(Container.DataItem, "BoolValue") %>
データ連結が template 宣言されたリストの内部で実行される場合には、データ行とデータ フィールドの両方をキャストする必要がある場合が多いため、DataBinder.Eval はそのような場合に特に役立ちます。
例
ASP.NET サーバー コントロールのプロパティに対してデータ連結を実行する例を次に示します。ユーザーが DropDownList という Web サーバー コントロールから状態を選択すると、Label という Web サーバー コントロールがリスト内の選択された項目に連結されます。
<html>
<head>
<script language="C#" runat="server">
void SubmitBtn_Click(Object sender, EventArgs e) {
// Rather than explictly pull out the variable from the StateList
// and then manipulate a label control, just call Page.DataBind.
// This will evaluate any <%# %> expressions within the page.
Page.DataBind();
}
</script>
</head>
<body>
<h3><font face="Verdana">Data binding to a property of another server control</font></h3>
<form runat="server">
<asp:DropDownList id="StateList" runat="server">
<asp:ListItem>CA</asp:ListItem>
<asp:ListItem>IN</asp:ListItem>
<asp:ListItem>KS</asp:ListItem>
<asp:ListItem>MD</asp:ListItem>
<asp:ListItem>MI</asp:ListItem>
<asp:ListItem>OR</asp:ListItem>
<asp:ListItem>TN</asp:ListItem>
<asp:ListItem>UT</asp:ListItem>
</asp:DropDownList>
<asp:button Text="Submit" OnClick="SubmitBtn_Click" runat="server"/>
<p>
Selected State: <asp:label text='<%# StateList.SelectedItem.Text %>' runat="server"/>
</form>
</body>
</html>
[Visual Basic]
<html>
<head>
<script language="VB" runat="server">
Sub SubmitBtn_Click(sender As Object, e As EventArgs)
' Rather than explictly pull out the variable from the StateList
' and then manipulate a label control, just call Page.DataBind.
' This will evaluate any <%# %> expressions within the page.
Page.DataBind()
End Sub
</script>
</head>
<body>
<h3><font face="Verdana">Data binding to a property of another server control</font></h3>
<form runat="server">
<asp:DropDownList id="StateList" runat="server">
<asp:ListItem>CA</asp:ListItem>
<asp:ListItem>IN</asp:ListItem>
<asp:ListItem>KS</asp:ListItem>
<asp:ListItem>MD</asp:ListItem>
<asp:ListItem>MI</asp:ListItem>
<asp:ListItem>OR</asp:ListItem>
<asp:ListItem>TN</asp:ListItem>
<asp:ListItem>UT</asp:ListItem>
</asp:DropDownList>
<asp:button Text="Submit" OnClick="SubmitBtn_Click" runat="server"/>
<p>
Selected State: <asp:label text='<%# StateList.SelectedItem.Text %>' runat="server"/>
</form>
</body>
</html>