【问题标题】:Declaratively access page properties data binding inside repeater以声明方式访问转发器内的页面属性数据绑定
【发布时间】:2014-08-02 04:00:12
【问题描述】:

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

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

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

* 更新 *

不需要 Eval 并引发错误。您可以只引用 MyProperty。但是,您必须在页面上调用 DataBind。一旦你这样做了,上面的语法在转发器之外工作,但在转发器内返回空。

很遗憾,我无法再重现此错误。我此时的假设是转发器没有绑定任何数据,所以它没有渲染。

【问题讨论】:

  • 如何为您的财产赋值?你也可以添加那个代码吗?
  • @Ali 在页面加载时设置。同样,我将代码移到中继器之外,它可以工作。中继器内部,数据未设置。
  • 请上传更多您的代码,仅通过查看此控件无人能提供帮助。在此处添加您的 aspx 和相关代码。
  • @CurtisWhite 你尝试了我下面的建议吗?
  • 为你的转发器添加标记,并显示调用DataBind()的代码。

标签: asp.net data-binding webforms repeater


【解决方案1】:

这里发生的事情比我们看到的要多 :) 将这段代码粘贴到一个新的空 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() 方法时才有效。我试了又试,但无法使您的原始语法正常工作(因此是空行输出),所以除非我有问题,否则您的代码 sn-p 只能在用户控件或数据绑定的页面/控件中工作.

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

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

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

希望这有助于解决问题。

【讨论】:

  • 对不起,我忘了补充。您必须调用 Page.DataBind() 才能使原始语法生效。使用 Page.DataBind(),您可以使用 或 并且在中继器之外都可以正常工作。在中继器内部,它们会导致数据绑定运行时错误。我还在研究你的答案,看看它是否合格。
  • 您的中继器中还必须有数据才能显示。我相信这是你的问题。不幸的是,现在原始语法对我有用,但我之前对其进行了广泛的测试,但它没有用。也许我遇到了与中继器中没有项目相同的“错误”。并且 Eval 语法不起作用。
  • 是的,任何您想要评估&lt;%# variable %&gt; 的控件都必须调用它的数据绑定方法,无论是在页面上还是在控件中。是的,您的数据绑定模板控件需要有数据供模板评估。干杯!
  • 有趣的是,可以使用
【解决方案2】:

不幸的是,我确信不起作用的语法现在似乎可以正常工作。我的假设是中继器也没有绑定任何数据,因此没有显示数据。该页面上有几个转发器,这可能是我感到困惑的原因。一旦你 Page.Databind() 并确保转发器有数据,原始语法就可以工作。

更新: 有趣的是,代码表达式语法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多