ASP.net内联表达式问题

9

我似乎无法弄清楚为什么下面的代码不起作用。我需要将文本框绑定到内联表达式的值。看起来很简单,对吧?但是这两个代码都不起作用。有任何想法吗?提前感谢。

<asp:textbox id="tbName" runat="server" Text='<%# Eval("test") %>' />
<asp:textbox id="tbName" runat="server" Text='<%= "test" %>' />

编辑:

需要说明的是,这个页面没有代码,只有以下指令在顶部。

<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Web" %>
<%@ Page Language="C#" %>

编辑:

除了添加代码后台之外,我能想到的唯一可行的解决方案是添加一个内联服务器脚本,就像这个例子。我希望我知道为什么内联表达式只有在数据绑定上下文中才能起作用。

<script language="C#" runat="server"> 
   private void Page_Load(object sender, System.EventArgs e)
    {
      tbName.Text = "test";
    }
</script>
6个回答

15
在Page_Load中,您将需要调用Page.DataBind()。
<asp:textbox id="tbName" runat="server" Text='<%# Eval("test") %>' />

工作。

<%= %> 是response.Write()的简写形式,对于任何服务器标记,都不可用作属性。

<%# %> 只能在数据绑定(在您的情况下为页面)的容器中使用。

<%$ %> 可用于访问资源文件中的数据。

编辑:您还可以查看 如何在标记中'绑定'标签的Text属性,这是一个类似的问题。


5
正如所述,<%= %> 在除了解析为内容的内部标记(例如Repeater中的<ItemTemplate>)之外的任何服务器控件声明中都是非法的。
<%# %> 用作控件属性的表达式是有效的,因为这些表达式将在调用控件的DataBind()时进行评估。
然而,您对Eval()的使用看起来有些可疑。根据示例,Eval()将使用当前Page对象作为绑定上下文,这意味着当调用DataBind()时,将绑定到名为“test”的公共属性的值。除非您实际上已在Page类上定义了此属性,否则表达式将永远不会评估为任何内容。
Eval()主要用于在诸如Repeater、GridView、ListView等控件中的表达式中使用,其中使用模板绑定数据项列表,并需要一种方法来访问当前数据项的属性。
对于所有其他控件,请在数据绑定表达式中使用普通代码表达式——它比依赖于运行时反射的Eval()更快、更直观。
如果您想要使用避免完全数据绑定的<%$ %>语法的更聪明的替代方案,请转到此处:

http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx


4

2
你可能需要使用文本框控件的命名空间。
<%@ Import "System.Web.UI.WebControls" %>

尝试过了,但仍然没有运气。 - James
你也可以尝试使用System.Web.UI。那里定义了Eval函数。 - Nick

2
尝试在服务器元素中添加runat="server"。否则,此元素将无法在服务器上处理。
编辑:实际上,“它是正确的”不起作用;代码<%=...%>不能在服务器标记中评估,只有表达式,例如<%$ Resources: h1 %>。

抱歉,那是我的笔误,控件已经被设置成runat=server,但仍然无法正常工作。 - James

1
<asp:textbox id="tbName" runat="server"><%="test"%></asp:textbox>

无法工作,我只得到“在此上下文中不支持代码块”的消息。我应该提到我的页面没有代码后台,我不确定这是否重要。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接