【问题标题】:What other objects are accessible inside <%# %> tags in aspx?在 aspx 的 <%# %> 标记中可以访问哪些其他对象?
【发布时间】:2008-10-09 00:51:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net data-binding


    【解决方案1】:

    在 标签内你可以访问

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

    【讨论】:

    • 如果您尚未在 .aspx/.ascx 文件中导入 Data 程序集,&lt;%#DirectCast(Container.DataItem, DataRow)("some_column")%&gt; 应该是 &lt;%#DirectCast(Container.DataItem, Data.DataRow)("some_column")%&gt;
    【解决方案2】:

    我相信您可以访问页面类范围内的任何内容,尽管表达式的结果被转换为字符串,因此您不能像使用“

    Here 是一篇不错的博文,深入探讨了生成的 ASPX 类。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          使用&lt;%# %&gt;实际上意味着当page.DataBind()方法正在执行时,这个块内的代码将被执行。因此,您可以访问该特定页面/控件作为受保护/公共访问的任何内容。

          【讨论】:

            【解决方案6】:

            很好的例子

            <%#((System.Data.DataRow)Container.DataItem)["ColumnName"].ToString()%>
            

            【讨论】:

              猜你喜欢
              • 2020-11-20
              • 2020-08-27
              • 1970-01-01
              • 2012-12-14
              • 2011-02-12
              • 2019-05-23
              • 1970-01-01
              • 1970-01-01
              • 2018-09-09
              相关资源
              最近更新 更多