Penulis: Walkdan (walkdan(at)gmail.com)
Eval() ASP.NET 2.0 menyederhanakan ASP 1.1 Container.DataItem, seperti:
<%# (Container.DataItem sebagai DataRowView)["ProductName"].ToString() %>
disederhanakan menjadi: (ASP 1.1 menghilangkan spesifikasi tipe, Eval diimplementasikan melalui refleksi, yang tidak akan dijelaskan dalam artikel ini)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
disederhanakan menjadi (ASP 2.0):
<%# Eval("Nama Produk") %>
Eval() adalah metode TemplateControl:Page
TemplateControl.Eval() dapat secara otomatis menghitung Container, dan mekanismenya adalah mendapatkannya dari tumpukan dataBindingContext:Stack.
1. Buat tumpukan Kontainer DataItem:
Di Control.DataBind(), tetapkan ini untuk memastikan bahwa Kontainer DataItem kontrol anak selalu berada di urutan teratas tumpukan.
Kontrol kelas publik
{
DataBind kekosongan virtual yang dilindungi (bool raiseOnDataBinding)
{
bool foundDataItem = salah;
jika (ini.IsBindingContainer)
{
objek o = DataBinder.GetDataItem(ini, dari foundDataItem);
jika(ditemukanDataItem)
Page.PushDataItemContext(o); <-- Dorong DataItem ke tumpukan
}
mencoba
{
jika (naikkanOnDataBinding)
OnDataBinding(EventArgs.Kosong);
DataBindChildren(); <-- mengikat kontrol anak
}
Akhirnya
{
jika(ditemukanDataItem)
Page.PopDataItemContext(); <-- Keluarkan DataItem dari tumpukan
}
}
}
2. Dapatkan Kontainer DataItem
Halaman kelas publik
{
objek publik GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- Baca Kontainer DataItem di bagian atas tumpukan, yang merupakan Kontainer DataItem yang sedang diikat.
}
}
3. TemplatContro.Eval()
TemplateControl kelas publik
{
string yang dilindungi Eval (ekspresi string, format string)
{
mengembalikan DataBinder.Eval (Page.GetDataItem(), ekspresi, format);
}
}