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