|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有个问题想请教你一下,呵呵:)你觉得将来学什么方向比较好,我真是想不出来,知道的太少了,麻烦了。函数|数据 本文假定你已懂得ASP1.1的数据绑定(出格是Container这个部分变量)的机制,这里次要剖析ASP2.0数据绑定做了那些改善。
ASP.NET2.0的数据绑定函数Eval()简化失落了ASP1.1奥秘的Container.DataItem,好比数据绑定表达式:
<%#(Container.DataItemasDataRowView)["ProductName"].ToString()%>
ASP1.1简化为:(往失落了范例指定,Eval经由过程反射完成,本文不再论述)
<%#DataBinder.Eval(Container.DataItem,"ProductName").ToString()%>
ASP2.0又简化为,往失落了Container部分变量:
<%#Eval("ProductName")%>
那末,Page.Eval()又是怎样晓得"ProductName"是谁人数据的属性呢,即Container.DataItem真的消散了吗?
Eval()是Page的父类TemplateControl的办法
TemplateControl.Eval()能够主动盘算出Container,机制就是从一个dataBindingContext:Stack仓库来猎取。
1.创建DataItemContainer栈:
在Control.DataBind()中,创建,如许能够包管子控件的DataItemContainer一直在栈顶。
publicclassControl
{
protectedvirtualvoidDataBind(boolraiseOnDataBinding)
{
boolfoundDataItem=false;
if(this.IsBindingContainer)
{
objecto=DataBinder.GetDataItem(this,outfoundDataItem);
if(foundDataItem)
Page.PushDataItemContext(o);<--将DataItem压进仓库
}
try
{
if(raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren();<--绑定子控件
}
finally
{
if(foundDataItem)
Page.PopDataItemContext();<--将DataItem弹出仓库
}
}
}
2.猎取DataItemContainer
publicclassPage
{
publicobjectGetDataItem()
{
...
returnthis._dataBindingContext.Peek();<--读取仓库顶部的DataItemContainer,就是正在绑定的DataItem Container
}
}
3.TemplateControl.Eval()
publicclassTemplateControl
{
protectedstringEval(stringexpression,stringformat)
{
returnDataBinder.Eval(Page.GetDataItem(),expression,format);
}
}
结论:
从下面看出Page.Eval()在盘算的时分仍是援用了Container.DataItem,只不外这个DataItem经由过程DataItemContainer仓库主动盘算出来的。我以为Page.Eval()看似把成绩简化了,实在把成绩弄得加倍奥秘。我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:) |
|