4

我在aspx页面中一直遇到类似的代码:

<asp:CheckBox Runat="server" ID="myid" Checked='<%# DataBinder.Eval(Container.DataItem, "column").Equals(1) %>'>

我想知道在该 <%# %> 标记内我可以访问哪些其他对象。为什么 DataBinder.Eval() 和 Container.DataItem 在 .CS 代码中的任何地方都不可见?

4

6 回答 6

8

在您可以访问的 <%# %> 标记内

  1. 在代码隐藏类中可见的任何内容(包括受保护的方法和属性)。
  2. 使用 <@import @> 在 aspx 页面上声明的任何内容。
  3. 触发 ItemDataBound 事件时作为事件参数传入的任何内容(例如,RepeaterItemEventArgs、DataListItemEventArgs 等)。

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()%>
于 2008-10-09T01:37:54.087 回答
1

我相信您可以访问页面类范围内的任何内容,尽管表达式的结果被转换为字符串,因此您不能像使用“<%”表达式漏洞那样嵌入条件表达式。

是一篇不错的博客文章,深入介绍了生成的 ASPX 类。

希望这可以帮助。

于 2008-10-09T01:12:58.613 回答
1

<%# 特定于内联 ASPX 数据绑定,就像发布的链接 ckramer 所暗示的那样。

为什么 DataBinder.Eval() 和 Container.DataItem 在 .CS 代码中的任何地方都不可见?

要访问代码隐藏中的绑定项,您需要设置一个ItemDataBound事件。

于 2008-10-09T01:31:55.347 回答
1

ASP.NET 为模板的每次出现生成一个 TemplateControl 的子类。数据绑定语句是在该类中的方法中使用的表达式。因此,您可以在 TemplateControl 上调用任何公共/受保护的实例方法。查看任何使用 XPath 的示例,因为这些示例将使用 XPath 和 XPathSelect 方法;Eval、XPath 和 XPathSelect 都是 TemplateControl 上的实例方法。

DataBinder其实是一个单独的类,Eval是它上面的公共静态方法;它在 System.Web.UI 中。DataBinder.Eval 和plain Eval 没有直接关系,尽管它们明显地做了非常相似的事情。

我相信“容器”实际上是编译数据绑定语句的局部变量或参数。我暂时不记得它的类型了。

于 2008-10-09T01:52:46.303 回答
1

很好的例子

<%#((System.Data.DataRow)Container.DataItem)["ColumnName"].ToString()%>
于 2009-08-17T12:13:23.310 回答
1

using<%# %>实际上意味着该块内的代码将在执行page.DataBind()方法时执行。因此,您可以访问该特定页面/控件作为受保护/公共访问的任何内容。

于 2009-08-17T12:25:59.087 回答