在aspx中的<%#%>标记内可以访问哪些其他对象?

Hao*_*est 4 asp.net data-binding

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

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

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

Fun*_*ung 8

在您有权访问的<%#%>标记内

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

Container实际上是RepeaterItemEventArgs.Item,DataListItemEventArgs.Item等的包装器.因此,您实际上可以在ItemDataBound事件中的代码中以e.Item(通常是事件参数参数名称)访问它.

使用System.Web.UI.DataBinder也可以在代码后面访问DataBinder.

另外,使用Eval优先选择转换Container.DataItem.Eval使用反射,因此有一个开销.在VB.NET中它会是这样的

<%#DirectCast(Container.DataItem, DataRow)("some_column")%>
Run Code Online (Sandbox Code Playgroud)

或C#

<%#((DataRow)Container.DataItem)["some_column"].ToString()%>
Run Code Online (Sandbox Code Playgroud)