2009-10-07 164 views
16

这是我昨晚给我的一个不好的答案。对于为什么一种方法起作用而不是另一种方法的好奇心正在困扰着我,我希望比我聪明的人能够给我正确的解释(或者指向我的文档)为什么下面的行为是如此。为什么<%= %>在一种情况下工作,但在另一种情况下不起作用

考虑下面的代码隐藏:

protected string GetMyText(string input) 
{ 
    return "Hello " + HttpUtility.HtmlEncode(input); 
} 

为什么这项工作

<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label> 

但这并不

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

编辑 - 添加

冒着让我原来愚蠢的回答低估了更多次的风险,这里是原始问题的链接,因为我现在得到的一些答案已经包含在这个问题中。

Why can't I set the asp:Label Text property by calling a method in the aspx file?

+0

单引号与双引号有什么区别吗?我知道一些语言将单引号内的所有内容都输出为纯输出,而双引号内的文本首先被计算出来... – peirix 2009-10-07 13:21:10

+2

@peirix - 单引号对双引号对ASP.NET语法没有任何影响。语法遵循XML语法规则,它声明可以互换使用双引号和单引号,只要您始终以与之相同的事物结束即可。 – 2009-10-07 13:29:18

回答

42

使用<%= %>等于把Response.Write("")在你的页面。当这样做:

<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label> 

的ASP.NET处理器计算控制,然后在渲染时,其输出&调用Response.Write在那里看到<%=控件的内容。

在这个例子中:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

你不能在一个文本属性使用Response.Write(""),因为它不返回一个字符串。它将其输出写入响应缓冲区并返回void。

如果要在ASP.NET标记中使用服务器标记语法,则需要使用<%# %>。标记数据的这种组合将绑定标签中的值。要做到这一点,你需要在你的页面的Load()方法中调用DataBind()来使其工作。

+0

+1是的,在文本属性中使用response.Write没有任何意义。 – RichardOD 2009-10-07 13:26:00

+1

要扩大“<%# %>”声明......它将在数据绑定时填充。这意味着除非在控件或其容器上调用'DataBind()',否则什么都不会发生。在OnLoad事件中可以调用'Page.DataBind()'(如Dan所说),如果没有其他事情导致控件上的数据绑定,但是如果控件已经是数据绑定的话就没有必要。 – Blixt 2009-10-07 13:29:15

+0

这是我第一次见到<%= %>构造和解释。有没有人知道一个很好的来源来详细解释所有的<%...%>结构,它们做什么以及何时使用它们? – 2009-10-07 15:12:09

2

格式错误:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

格式正确使用资源:

<asp:Label ID="Label1" runat="server" Text='<%$ Resources:Resource, MyText %' /> 
4

因为它们都是服务器端的指令 - 代码的第二部分是相当于:

<asp:Label ID="Label1" runat="server" Text='Response.Write(GetMyText("LabelText"))' /> 
1

做这个服务器控件,如果你有一个全球资源文件的LabelText的:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources: resourceName, LabelText %>" /> 
4

<%= GetMyText(“LabelText”)%>基本上表示

响应。写(GetMyText( “LabelText的”));

这里还行。 <%= GetMyText( “LabelText的”)%>

然而,当使用此:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

这基本上意味着:

Label1.Text =回复于(GetMyText( “LabelText的” ));

这是一个错误的陈述。

1

对于它在第二种情况下工作,你会如下希望:

<asp:Label ID="Label1" runat="server" Text="<%# GetMyText("LabelText") %>" /> 

然后Label1的需要进行数据绑定。

相关问题