ASP.net内联表达问题

时间:2009-02-17 22:11:21

标签: asp.net data-binding

我似乎无法弄清楚为什么这不起作用。我需要将文本框绑定到内联表达式中的值。好像很简单吧?但这些都不奏效。有任何想法吗?提前谢谢。

<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 个答案:

答案 0 :(得分:15)

在Page_Load中你必须调用Page.DataBind()

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

工作。

&lt;%=%&gt;是一个缩短的response.Write(),永远不会作为任何服务器标签的属性。

&lt;%#%&gt;只有当conatainer是数据绑定时(例如你的页面),才能使用它。

&lt;%$%&gt;可用于访问资源文件中的数据。

编辑:您还可以查看How to 'bind' Text property of a label in markup这是一个非常相似的问题。

答案 1 :(得分:5)

如上所述,&lt;%=%&gt;在服务器控件声明中的任何位置都是非法的,除非内部标记被解析为内容(例如&lt; ItemTemplate&gt;在Repeater中)。

&lt;%#%&gt;作为控件属性的表达式有效,因为在控件上调用DataBind()时将评估这些表达式。

你使用Eval()看起来有点怀疑。根据示例,Eval()将使用当前Page对象作为绑定上下文,这意味着在调用DataBind()时,将绑定名为“test”的公共属性的值。除非您确实在Page类上定义了此属性,否则表达式永远不会计算为任何内容。

Eval()主要用于控件中的表达式,例如Repeater,GridView,ListView等,其中有一个使用模板绑定的数据项列表,并且您需要一种方法来访问属性当前数据项。

对于所有其他控件,只需在数据绑定表达式中使用普通代码表达式 - 它比Eval()更快,更直观,它依赖于运行时反射。

如果您想要使用&lt;%$%&gt;的更聪明的替代品完全避免数据绑定的语法,请转到此处:

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

答案 2 :(得分:4)

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

并在页面加载事件中设置tbName.DataBind();

有关正在搜索有关内联表达式的更多信息的用户,请参阅以下链接。

ASP.net有以下inline expressions

答案 3 :(得分:2)

尝试将runat =“server”添加到服务器元素。 否则,将不会在服务器上处理此元素。

编辑:实际上,“这是正确的”,这是行不通的;代码&lt;%= ...%&gt;无法在服务器标记中进行评估,只有例如&lt;%$ Resources:h1%&gt;等表达式

答案 4 :(得分:2)

您可能需要文本框控件的命名空间

<%@ Import "System.Web.UI.WebControls" %>

答案 5 :(得分:1)

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