我在ASP.NET Forms页面上有一个公共属性。我可以使用以下代码以声明方式访问此页面属性:
<asp:Image ID="PageImage" runat="server" ImageUrl="<%# MyProperty %>" />
但是,一旦我将相同的代码放在转发器中,它就不起作用了。我寻求解释和解决方案。
*更新*
不需要Eval并抛出一个错误。您可以参考MyProperty。但是,您必须在页面上调用DataBind。完成后,上述语法在转发器之外工作,但在转发器内返回空。
不幸的是,我不再能够重现这个错误。我此时的假设是转发器没有绑定任何数据,因此它没有渲染。
答案 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;%=允许在没有数据绑定的情况下访问页面属性。