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



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

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

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

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

  1. 在代码隐藏类中可见的任何内容(包括受保护的方法和属性)
  2. 在aspx页面上使用<导入@>
  3. 当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()%>

相关内容

  • 没有找到相关文章

最新更新