by WebSurfer
2010年8月17日 23:44
<%# 文字と %> 文字で囲んで用いるデータバインド式を使用すると、ページで DataBind メソッドが呼び出されたときに、サーバーコントロールプロパティとデータソースの間にバインディングが作成されます。
Eval や Bind メソッドを TextBox や Label コントロールの Text プロパティに以下のように設定して使うことが多いと思います。
Text='<%# Eval("Name") %>'
上記のような単純な使い方なら間違うことはなさそうですが、複雑な文字列を組み立てる場合は、別にそのためのメソッドを定義して用いるのがよさそうです。
例えば、以下のようにメソッドで文字列を組み立てて、
string Description(string s, int n)
{
return String.Format("項目 {0} の数量は {1} です。", s, n);
}
それを以下のように設定できます。
Text='<%# Description((string)Eval("Name"), (int)Eval("Qty")) %>'
ただし、メソッドを使うまでもない簡単な文字列なら、例えば以下のようにする方がよいと思います。
Text='<%# "Name:" + Eval("Name") %>'
なお、以下のようにするのは、データバインド式を含めた全体が文字列として解釈されてしまうので、うまくいきません。
Text='Name:<%# Eval("Name") %>'
ありそうな間違いは、ImageUrl や NavigateUrl に、例えば、以下のように設定するケースでしょうか。
ImageUrl='~/Images/<%# Eval("Name") %>'
この結果は以下のようになってしまいます。
src="Images/%3C%25#%20Eval(%22Name%22)%20%25%3E"
(注)ImageUrl の場合は UrlEncode されるので、< や % などが %3C と %25 になります。一方、NavigateUrl の方は何故か UrlEncode されません。