我在aspx页面中经常遇到类似的代码:
<asp:CheckBox Runat="server" ID="myid" Checked='<%# DataBinder.Eval(Container.DataItem, "column").Equals(1) %>'>
我想知道我可以访问<%#%>内部的其他对象标签为什么DataBinder.Eval()和Container.DataItem在.CS代码中的任何位置都不可见?
在<%#%>内您可以访问的标签
- 在代码隐藏类中可见的任何内容(包括受保护的方法和属性)
- 在aspx页面上使用<导入@>
- 当ItemDataBound事件被激发时作为事件参数传入的任何内容(例如RepeaterItemEventArgs、DataListItemEventArg等)
Container实际上是RepeaterItemEventArgs.Item、DataListItemEventArgs.Item等的包装器。因此,您实际上可以在ItemDataBound事件中以e.Item(e通常是事件参数参数名称)的形式在代码隐藏中访问它。
DataBinder也可以使用System.Web.UI.DataBinder.在代码隐藏中访问
附带说明一下,铸造Container.DataItem比使用Eval更可取。埃瓦尔使用反射,所以那里有一个头顶。在VB.NET中,它类似于
<%#DirectCast(Container.DataItem, DataRow)("some_column")%>
或C#
<%#((DataRow)Container.DataItem)["some_column"].ToString()%>
尽管表达式的结果被转换为字符串,但我相信您可以访问页面类范围内的任何内容,因此您不能像使用"<%"表达式孔那样嵌入条件表达式。
这是一篇很好的博客文章,深入研究了生成的ASPX类。
希望这能有所帮助。
<%#是特定于内联ASPX数据绑定的,就像ckramer发布的链接所建议的那样。
为什么DataBinder.Eval()和Container.DataItem在.CS代码中的任何位置都不可见?
若要访问codebehind中的绑定项,您需要设置ItemDataBound事件。
ASP.NET为模板的每次出现生成TemplateControl的子类。数据绑定语句是在该类内的方法中使用的表达式。因此,您可以在TemplateControl上调用任何公共/受保护的实例方法。请参阅任何使用XPath的示例,因为这些示例将使用XPath和XPathSelect方法;Eval、XPath和XPathSelect都是TemplateControl上的实例方法。
DataBinder实际上是一个单独的类,Eval是它上面的一个公共静态方法;它在System.Web.UI.DataBinder.Eval和普通Eval没有直接关系,尽管它们明显地做着非常相似的事情。
我相信"Container"实际上是编译数据绑定语句的局部变量或参数。我现在记不起它的类型了。
使用<%# %>
实际上意味着在执行page.DataBind()
方法时将执行此块内的代码。因此,您可以访问该特定页面/控件的受保护/公共访问的任何内容。
的好例子
<%#((System.Data.DataRow)Container.DataItem)["ColumnName"].ToString()%>