〈%# 〉與〈%= 〉的區別,顯示資料與繫結資料

鴨脖發表於2013-10-13
有很長時間沒來 CSDN 的部落格了。今天在社群裡看到一個網友提問關於 asp.net 中“<%# %>” 的問題,所以還是想把這篇文章發到自己的部落格上。雖然不是非常很高深的問題,但是還是應該多加留意……


aspx頁面中,<%= %>  <%# %> 的區別

關於這個問題,在多數的 ASP.NET 的教材中,都提到了一些。<%= %><%# %>的區別在於:繫結時機不同,<%# %>是在控制元件呼叫DataBind函式的時候才被確定。對於<%= %>,我想你應該不會陌生,在ASP時代,它就相當於 Response.Write。在ASP.NET時代也一樣。暫時先不去理會教材中說的,也先把“繫結時機”放到一邊。<%= %><%# %>的區別是:前者是輸出,而後者是賦值!即:

   <%= "A" %> 相當於:Response.Write("A");

   <%# "A" %> 相當於:變數="A";


先來看一個例子:


<html>

<body>

<asp:Button Text=<%# "Hello, the Internet!" %> RunAt="Server" ID="testButton" />

</body>

</html>



這句話相當於賦值,把上面這個勾黑句子翻譯成後臺程式碼就是:testButton.Text="Hello, the Internet!";

第二個例子:

<html>

<body>

<%= "Hello, the Internet!" %>

<%# "Hello, the Internet!" %>

</body>

</html>

<%= "Hello, the Internet!" %> 就相當於:Response.Write("Hello, the Internet!");

那麼第二個<%# %>怎麼解釋呢?如果按照我“賦值”的說法,它把值賦給誰了呢?

其實翻譯成後臺程式碼是這樣的:(new System.Web.UI.LiteralControl()).Text="Hello, the Internet!";


一段文字,雖然它不被包含在任何開始結束標籤之間,但是[font='Courier]ASP.NET[/font]也認為它是一個控制元件。一個[font='Courier]LiteralControl[/font]控制元件。所以,[font='Courier]<%# %>[/font]就是把值賦給[font='Courier]LiteralControl[/font]控制元件的Text屬性。

我做過一個生成靜態 HTML 程式碼的類,使用的手法是包裝了 HtmlTextWriter這個類。並且我做了跟蹤除錯。跟蹤的結果令我感到很意外。ASP.NET 會把所有的未標有“runat=server”屬性的標記,統統看作是一個LiteralControl 控制元件。例如在上面那些 HTML 程式碼裡,例如在文章開始處的那些 HTML 程式碼裡,ASP.NET會認為是有三個伺服器控制元件,分別是:LiteralControl、Button、LiteralCtontrol。第一個LiteralControl 的 Text 值為“<html><body>Hello, theInternet!”,而最後一個 LiteralControl 的 Text值是“</body></html>”。也就是說,<%= %> 應早於 <%#%>,先被“翻譯”出來……

相關文章