2009-10-07 163 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的需要進行數據綁定。

相關問題