ผู้เขียน: Walkdan (walkdan(at)gmail.com)
Eval() ของ ASP.NET 2.0 ทำให้ ASP 1.1 Container.DataItem ง่ายขึ้น เช่น:
<%# (Container.DataItem as DataRowView)["ProductName"].ToString( ) %>
ถูกทำให้ง่ายขึ้นเป็น: (ASP 1.1 ลบข้อกำหนดประเภท Eval ถูกนำมาใช้ผ่านการสะท้อนกลับ ซึ่งจะไม่มีการอธิบายในบทความนี้)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
ถูกทำให้ง่ายขึ้นเป็น (ASP 2.0):
<%# ประเมิน("ชื่อผลิตภัณฑ์") %>
Eval() เป็นวิธีการของ TemplateControl:Page
TemplateControl.Eval() สามารถคำนวณคอนเทนเนอร์ได้โดยอัตโนมัติ และกลไกคือการรับมาจาก dataBindingContext:Stack stack
1. สร้างสแต็กคอนเทนเนอร์ DataItem:
ใน Control.DataBind() ให้สร้างสิ่งนี้เพื่อให้แน่ใจว่า DataItem Container ของตัวควบคุมลูกจะอยู่ด้านบนสุดของสแต็กเสมอ
การควบคุมคลาสสาธารณะ
-
DataBind โมฆะเสมือนที่ได้รับการป้องกัน (บูล RaiseOnDataBinding)
-
บูล foundDataItem = false;
ถ้า (this.IsBindingContainer)
-
วัตถุ o = DataBinder.GetDataItem (นี่คือ พบ DataItem);
ถ้า (foundDataItem)
Page.PushDataItemContext(o); <-- พุช DataItem ลงบนสแต็ก
-
พยายาม
-
ถ้า (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- ผูกส่วนควบคุมลูก
-
ในที่สุด
-
ถ้า (foundDataItem)
Page.PopDataItemContext(); <-- เปิด DataItem จากสแต็ก
-
-
}
2. รับคอนเทนเนอร์ DataItem
หน้าชั้นเรียนสาธารณะ
-
วัตถุสาธารณะ GetDataItem()
-
-
return this._dataBindingContext.Peek(); <-- อ่าน DataItem Container ที่ด้านบนของสแต็ก ซึ่งเป็น DataItem Container ที่ถูกผูกไว้
-
-
3. TemplateContro.Eval()
TemplateControl คลาสสาธารณะ
-
Eval สตริงที่ได้รับการป้องกัน (นิพจน์สตริง, รูปแบบสตริง)
-
ส่งคืน DataBinder.Eval (Page.GetDataItem(), นิพจน์, รูปแบบ);
-
-