<%%>與<scriptrunat=server>,<%=%>與<%#%>的區別(轉)
這些東西都是asp.net前臺頁面與後臺代碼交互過程中經常使用的,它們之間有的非常相似,又有一些不同。對比學習下,看看他們之間的聯系與區別。
首先看<%%>與<scriptrunat=server>,再看<%#%>與<%=%>的聯系與區別:
<%%>與<scriptrunat=server>
在asp.net的前臺頁面(.aspx)文件中,以上的兩種方式都被允許來插入代碼片段。但是用的時候可以看的出,二者之中插入的代碼的限制是不同的。
<%%>一般都是聲明一些變量,寫一些輸出語句,還可以引用一些服務器端的變量,調用服務器端的函數。而其本身內部確不能聲明函數或過程。
<scriptrunat=server>中只能放置方法和屬性等,而不能直接添加語句和表達式。
舉例:
[html] view plain copy
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title></title>
- </head>
- <script runat="server">
- string a = "HelloWorld";
- public void test() {
- Response.Write(a);
- }
- //直接寫語句,錯誤的寫法
- //Response.Write("a");
- </script>
- <%
- string a = "HelloWorld";
- Response.Write(a);
- //聲明函數,錯誤的寫法
- //public void test2() {}
- %>
- <body>
- </body>
- </html><span style="font-family: ‘Microsoft YaHei‘; font-size: 14px;"> </span>
上面為使用上得區別,究其原因,應該在ASP.NET頁面編譯上。編譯時每個ASPX頁面被編譯成一個直接或間接繼承於PAGE類的類:
? <%%>稱為渲染代碼區,在這個類中扮演的是其中一個方法(會被編譯到PAGE類的Render方法中),也就是說,所有寫在
<%%>中的代碼編譯後都成為某個方法內的語句塊。那麽在<%%>中所能包含的就只能是在一個方法裏面所能包含的東西了,就是
一個方法的一對大括號中所能寫的東西才能寫在<%%>中
在C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\中有緩存文件,可反編譯的看
? <script runat=server>稱為代碼聲明區,其中的代碼則被編譯為類的花括號之間的內容,也就是說一個類所能包含的內容都
能寫在<scriptrunat="server"></script>標簽中間。
這也就不奇怪,兩者之間所寫內容限制的區別了。
<%=%>與<%#%>
二者都用於在前臺頁面綁定後臺的一些變量或返回值進行顯示,而用法也有很大差別:
? 首先,字面上的區別,前者是輸出,而後者是賦值
<%= "A" % > 相當於:Response.Write("A");
<%# "A" % > 相當於:變量="A";
舉例:
[html] view plain copy- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <asp:TextBox ID="TextBox1" runat="server" Text="<%#"Hello" %>"></asp:TextBox>
- <div>
- <%="Hello" %>
- <%#"Hello" %>
- </div>
- </form>
- </body>
- </html>
上面的Text="<%#"Hello" %>"相當於TextBox1.text=”Hello”;
<%="Hello" %>相當於Response.Write("Hello");
那麽第二個 <%# Hello% >怎麽解釋呢?如果按照我“賦值”的說法,它把值賦給誰了呢?可以查看後臺代碼是這樣的:
(new System.Web.UI.LiteralControl()).Text="Hello";
? 在應用過程中,二者使用的位置和時機是有很大區別的
一般來說,在前臺代碼的三種位置可能會用到兩種符號來(綁定、顯示)後臺變量:
? JavaScript代碼中
? 服務器端控件屬性或HTML標簽屬性
? Html顯示內容的位置,即,它作為占位符把變量顯示於符號出現的位置(例如div之間)
對三個位置進行了簡要實驗:
位置一:一般只要綁定的後臺變量和JavaScript中數據類型兼容即可。
位置二和三:
先定義後臺方法和變量,然後在前臺進行綁定實驗,後臺代碼(定義方法):
[csharp] view plain copy- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- namespace WebApplication4
- {
- public partial class WebForm1 : System.Web.UI.Page
- {
- public string name = "我是後臺變量";
- protected void Page_Load(object sender, EventArgs e)
- {
- this.DataBind();
- }
- //不能為private
- protected string strTest() {
- return "後臺方法";
- }
- }
- }
<%#%>可用位置
(1)Html控件和Web控件的屬性賦值,如:
(2)作為顯示內容顯示在占位位置,如上面的<%#name%>
(3)Web控件一對標簽屬性之間,這裏需要註意,只有一部分控件的標簽屬性對之間可以使用比如標簽(Label)控件,而一部分不能使用,比如文本(TextBox)控件,這是因為Label屬於嵌套類控件,而TextBox屬於非嵌套類控件。
如:
<%=%>可用位置
(1) 只能為Html控件屬性賦值,而不能為Web控件屬性賦值,如:
(2) 可作為顯示內容,顯示在占位位置,如上面的<%=name%>
(3) 放與Web控件標簽之間的規則同<%#%>相同,即可放於嵌套控件標簽對之間,而不能放於非嵌套控件標簽之間
總結
這些都是使用過程中總結出來的小經驗,熟練掌握,還是能提高一點學習效率的,請大家借鑒。
<%%>與<scriptrunat=server>,<%=%>與<%#%>的區別(轉)