المؤلف: 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("ProductName") %>
Eval () هي إحدى طرق TemplateControl:Page
يمكن لـ TemplateControl.Eval() حساب الحاوية تلقائيًا، وتتمثل الآلية في الحصول عليها من مكدس dataBindingContext:Stack.
1. قم بإنشاء مكدس حاوية DataItem:
في Control.DataBind()، قم بتأسيس هذا للتأكد من أن حاوية DataItem لعنصر التحكم التابع تكون دائمًا في أعلى المكدس.
التحكم في الطبقة العامة
{
DataBind الظاهري المحمي (bool riseOnDataBinding)
{
bool FoundDataItem = false;
إذا (this.IsBindingContainer)
{
object o = DataBinder.GetDataItem(this, out FoundDataItem);
إذا (وجدت بيانات)
Page.PushDataItemContext(o); <-- ادفع DataItem إلى المكدس
}
يحاول
{
إذا (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- ربط عناصر التحكم التابعة
}
أخيراً
{
إذا (وجدت بيانات)
Page.PopDataItemContext(); <-- أخرج DataItem من المكدس
}
}
}
2. احصل على حاوية DataItem
صفحة الطبقة العامة
{
الكائن العام GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- اقرأ حاوية DataItem في الجزء العلوي من المكدس، وهي حاوية DataItem المرتبطة.
}
}
3. TemplateContro.Eval()
التحكم في قالب الطبقة العامة
{
سلسلة محمية Eval (تعبير السلسلة، تنسيق السلسلة)
{
إرجاع DataBinder.Eval (Page.GetDataItem()، التعبير، التنسيق)؛
}
}