2012-04-11 51 views
1

我正在學習一些aspx並有一個問題。我有以下示例代碼:Aspx代碼塊vs runat服務器

<%@ Page Language="C#" %> 
<html> 
<body> 
    <form id="form1" runat="server"> 
     Current server time is <% =GetTime()%>. 
    </form> 
</body> 
</html> 

現在我不明白這裏要說的是,如果形式在服務器上運行已經,爲什麼我們再次需要<%%>代碼塊?也許我沒有理解代碼塊與頁面上服務器的整體運行之間的區別。任何人都可以澄清我對這裏發生的事情的誤解嗎?我只是不真正瞭解aspx頁面的serverside和clientide術語。這樣

我也看到代碼:

<script language="VB" runat="server"> 
Dim .... 

Public Sub PageLoad() 
... 
Response.Write("Hello") 
End Sub 
</script> 

<% If dataExists(whatever) Then %> 
HelloWorld 

現在爲什麼想不出代碼塊被上述淘汰?我的意思是在服務器標籤中,代碼已經在運行服務器端併發出一些寫入請求。然後你有代碼塊正在做一些邏輯檢查再次寫入。爲什麼分開這些? Arent他們相同的功能,或者我錯過了什麼?

回答

2

讓我們從頭開始說清楚一件事。你是不是學習ASPX,除非你想了解這個文件的擴展名,你在學習ASP.NET的和更具體的的ASP.NET Web窗體

來自Web窗體(aspx文件中的代碼)的標記由ASP.Net解析,然後將生成一個類,稍後將用它來實際創建HTML。

此標記可以包含純html,服務器控件(<asp:Label />等),代碼塊,DataBinding表達式,資源表達式和many more

所有這些只是解析,以獲得生成的類。生成的類將包含或多或少的指令,供作者編寫一些字符串(如果需要,請使用html)。

也許你已經看過this example現在你可以發現這是某種語法糖。

<% { Response.Write(DateTime.Now.ToString()); }%> 

VS

<%= DateTime.Now.ToString() %> 

它產生同樣的事情,但被寫在兩種不同的方式。該語法只是解析。

服務器代碼和客戶端代碼之間只有一個區別:服務器代碼在服務器上運行,客戶端代碼在客戶端上運行。該客戶端代碼是(或可能)由服務器生成的,因此客戶端可以將其運行。

0

<% ... %>塊表示框架代碼(在本例中爲C#),而文檔的其餘部分是純HTML。
所以塊被用來區分代碼和簡單標記。

0

當您將runat="server"添加到html元素時,它會將其變爲服務器端對象。這意味着在Designer文件中創建了一個HtmlForm實例。除非有其他服務器端控件將被添加到控制樹中,否則不包括標籤內部的內容。在標籤內部,您可以重新編寫簡單的Html文件,直到您爲.Net留下其他內容,例如<% =GetTime()%>

0

代碼塊只是允許處理引擎知道要執行的頁面的哪些部分(如果沒有,那麼告訴頁面的哪些部分是代碼以及哪些只是標記就很難)。

0

代碼塊是從C#代碼中描繪嚴格HTML的方式。

如果你寫

<form id="form1" runat="server"> 
    Current server time is GetTime(). 
</form> 

,那麼你會得到文字一字不差。只有當您添加解析器可以理解的代碼塊才能切換到HTML的特定部分的C#代碼時。

而不是重新寫一個已經很好地回答:Here is the SO question as to what the runat server is for

0

簡而言之,瀏覽器從服務器請求頁面時,ASP.NET隨後處理中<% ... %>阻止任何可執行代碼,即任何代碼,結果然後發回給瀏覽器。

查看它的另一種方法是你想運行服務器端的任何代碼都應該在<% ... %>塊內,其他所有內容都是客戶端。