声明性地访问转发器内的页面属性数据绑定

时间:2014-06-11 23:07:54

标签: asp.net data-binding webforms repeater

我在ASP.NET Forms页面上有一个公共属性。我可以使用以下代码以声明方式访问此页面属性:

<asp:Image ID="PageImage" runat="server" ImageUrl="<%# MyProperty %>" />

但是,一旦我将相同的代码放在转发器中,它就不起作用了。我寻求解释和解决方案。

*更新*

不需要Eval并抛出一个错误。您可以参考MyProperty。但是,您必须在页面上调用DataBind。完成后,上述语法在转发器之外工作,但在转发器内返回空。

不幸的是,我不再能够重现这个错误。我此时的假设是转发器没有绑定任何数据,因此它没有渲染。

2 个答案:

答案 0 :(得分:3)

这里有更多的事情发生在眼睛上:)请将此代码粘贴到一个新的空的asp.net webforms项目全新的webforms页面中:

    <script runat="server">
        protected string MyProperty
        {
            get
            {
                return "SUCCESS";
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            rTest.DataSource = new int[] { 1, 2, 3 };
            rTest.DataBind();
        }
    </script>
    <%: MyProperty  %><br />
    <asp:Literal ID="ltrlTest" runat="server" Text='<%# MyProperty %>' /><br />
    <asp:Repeater runat="server">
        <ItemTemplate>
            <asp:Literal runat="server" Text="<%# MyProperty %>" /><br />
        </ItemTemplate>
    </asp:Repeater>

你得到输出:

SUCCESS

SUCCESS
SUCCESS
SUCCESS

为什么呢?那么你提供的语法是数据绑定,只有在控件调用了DataBind()方法时才有效。我尝试过并尝试过无法使用原始语法(因此空行输出),所以除非我出错了,否则您的代码片段只能在用户控件或数据绑定的页面/控件中工作。 / p>

从示例中可以看出,您可以从转发器模板中完全访问这些属性,并且可以使用=:将该属性输出到页面,但要使其能够正常工作你描述的方式需要比默认方案更神奇。

看看这个SO question,看看this msdn article上的数据绑定表达式语法区域。

现在,如果我向页面加载添加ltrlTest.DataBind(),我获得5次成功输出。这是<%#语法工作的唯一方式。

希望有助于澄清事情。

答案 1 :(得分:1)

不幸的是,我确信不起作用的语法现在似乎运行得很好。我的假设是转发器也没有任何数据绑定它,因此数据没有显示。该页面上有几个中继器,这可能是我混淆的原因。一旦你Page.Databind()并确保转发器具有原始语法的数据。

更新: 有趣的是,代码表达式语法&lt;%:和&lt;%=允许在没有数据绑定的情况下访问页面属性。