2017-08-02 18 views
5
<%@ Page Language="C#" %> 

<!DOCTYPE html> 

<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     myTr.Visible = false; 
     mySpan.Visible = false; 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <table runat="server"> 
      <tr id="myTr"> 
       <td>Hello</td> 
       <td><span id="mySpan">World</span></td> 
      </tr> 
      <tr> 
       <td>Hi</td> 
       <td>Bye</td> 
      </tr> 
     </table> 
    </form> 
</body> 
</html> 

通知myTrmySpan都沒有RUNAT =服務器,但是編譯器只給出了mySpan.Visible = false錯誤。爲什麼我可以從服務器端訪問沒有runat = server的HTML元素?

enter image description here

爲什麼不上myTr.Visible = false編譯器報錯?

回答

1

我的猜測是你能夠訪問你的tr,因爲表在服務器上運行,tr是表本身的一部分。

另一方面,span元素只能從客戶端訪問,因爲它沒有在服務器端呈現。

如果你添加一個id給表中的某個td,你可以在服務器端腳本中訪問它。但是,如果您從表中刪除runat="server",則在嘗試訪問表組件時會出現構建錯誤。

<table runat="server"> 
    <tr id="myTr"> 
     <td id="myTd">Hello</td> <%--This td is also accessible from the server script--%> 
     <td><span id="mySpan">World</span></td> 
    </tr> 
</table> 

UPDATE: OK,這不是一種猜測了。根據Michael Amundsen和Paul Litwin在他們的書ASP.NET for Developers中的很好的解釋。你可以看到那裏的原因。

總結這裏按照您的評論也: 在136頁,字幕:表頭(TH),行(TR)和詳細信息(TD),它說:你也可以使用服務器端代碼操縱表格的th,tr和td標籤。 清單8.9使用服務器端代碼處理Th,Tr和Td標記與您的非常相似。

基本上與ID的runat="server"thtrtd元素的表的屬性只被有效地從Page_Load事件處理程序訪問在列表的頂部(沒有RUNAT =「服務器」)。

如果您繼續閱讀,您會看到關於服務器控件的解釋以及ASP.NET如何將它們與Html元素進行匹配。

希望這會有所幫助!

+0

這本書沒有說明爲什麼我們可以訪問沒有runat = server的元素,除非我是盲人。你能否公平使用,並在你的答案中包含該部分? – Gqqnbig

+0

@LoveRight在頁136上,字幕:表頭(Th),行(Tr)和細節(Td):它也可以使用服務器端代碼來操縱表格的th,tr和td標籤。清單8.9:使用服務器端代碼處理Th,Tr和Td標記與您的非常相似。基本上,一個包含runat =「server」的表以及只有id屬性(不是runat =「server」)的th,tr和td元素可以從列表頂部的Page_Load事件處理程序中有效訪問。如果您繼續閱讀,您會看到有關服務器控件的解釋以及ASP.NET如何將它們與Html元素進行匹配。 –

相關問題