我在 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/