asp.net - 以声明方式访问转发器内的页面属性数据绑定(bind)

标签 asp.net data-binding webforms repeater

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

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

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

* 更新 *

不需要 Eval 并抛出错误。您只需引用 MyProperty 即可。但是,您必须在页面上调用 DataBind。执行此操作后,上述语法在转发器外部起作用,但在转发器内部返回空。

不幸的是,我无法再重现这个错误。我此时的假设是中继器没有绑定(bind)任何数据,因此它没有渲染。

最佳答案

这里发生的事情比表面上看到的要多:) 将此代码粘贴到一个新的空 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
为什么?您提供的语法用于数据绑定(bind),并且仅在控件调用其 DataBind() 方法时才有效。我尝试了又尝试,但无法让您的原始语法起作用(因此是空行输出),因此除非我有问题,否则您的代码片段只能在用户控件或正在数据绑定(bind)的页面/控件内工作。

正如您从示例中看到的,您完全可以从转发器模板内部访问这些属性,并且可以使用 = 将该属性输出到页面。或:但要让事情按照您所描述的方式工作,需要比默认场景更多的魔力。

看看这个 SO question ,并查看 this msdn article 上的数据绑定(bind)表达式语法区域。 .

现在如果我添加 ltrlTest.DataBind()页面加载我获得 5 个成功输出。这是<%#的唯一方法语法将起作用。

希望有助于解决问题。

关于asp.net - 以声明方式访问转发器内的页面属性数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174040/

相关文章:

wpf - 我们可以将动态数据(数据集或列表)绑定(bind)到WPF中的控件吗

asp.net - CssClass 在 Asp.net 网站中没有改变

asp.net-mvc - 如何在 Razor 和 Webforms 之间共享母版页

c# - 允许按列 gridview 排序

c# - 获取特定国家/地区的当前日期和时间

ASP.NET MVC - 在布局中有条件地呈现部分

asp.net - 在 "insert mode"中时,在将详细信息 View 插入数据库之前修改已编辑的字段

asp.net - ModelState.IsValid 为真,但 POST 数据中缺少 [Required] 属性

wpf - 当 ItemsSource 更改时如何使 SelectionChanged 静音

javascript - 页面重定向