2008-11-20 66 views
194

爲什麼我必須在我所有的ASP.NET控件上指定runat="server",這是必需的屬性,並且server是我有限的ASP.NET知識中唯一可用的選項,如果我不使用它,則會出錯?爲什麼ASP.NET webforms需要Runat =「Server」屬性?

我明白,我可以選擇在我的HTML標籤上使用它,並且我理解客戶端/服務器範例以及它實際指定的內容。

這是一個冗餘標籤,它可能只是被控件作爲ASP.NET控件所隱含,或者是否存在潛在的原因?

+2

我同意這個問題,澄清一點,是不是'asp:'(和標題中指定的其他標籤)足以解析?或者在控件轉換爲INPUT後,runat被擊中,從而與其他HTML無法區分?我認爲在runat仍然處於服務器控制形式時會被擊中...... – abend 2012-03-05 15:13:07

+0

也許在Web.config中添加一種「* default attribute *」配置選項,它可能是前綴或名稱,可能是一個合適的解決方法。在解析過程中,默認屬性可以在必要時注入到DOM中。我會玩這個想法... – Dan 2012-11-07 16:38:23

回答

107

我一直認爲它有更多的理解,你可以混合使用ASP.NET標籤和HTML標籤,而HTML標籤可以選擇是runat="server"或不是。它不會損害任何東西來保留標籤,並且會導致編譯器錯誤將其取出。你對網絡語言的暗示越多,新生的程序員就越容易進入並學習它。這與任何有關標籤屬性的詳細信息都是一樣的原因。

這次對話是在Mike Schinkel的Blog之間的,他本人和微軟國家服務的Talbot Crowell之間。相關信息如下(第一段意譯由於源語法錯誤):

[...] but the importance of <runat="server"> is more for consistency and extensibility.

If the developer has to mark some tags (viz. <asp: />) for the ASP.NET Engine to ignore, then there's also the potential issue of namespace collisions among tags and future enhancements. By requiring the <runat="server"> attribute, this is negated.

它繼續:

If <runat=client> was required for all client-side tags, the parser would need to parse all tags and strip out the <runat=client> part.

他繼續說:

Currently, If my guess is correct, the parser simply ignores all text (tags or no tags) unless it is a tag with the runat=server attribute or a 「 <% 」 prefix or ssi 「 <!– #include(...) Also, since ASP.NET is designed to allow separation of the web designers (foo.aspx) from the web developers (foo.aspx.vb), the web designers can use their own web designer tools to place HTML and client-side JavaScript without having to know about ASP.NET specific tags or attributes.

+53

不管是什麼原因,當它可以安全地作爲默認值時,仍然是PITA必須爲每個標籤輸入它。 – belugabob 2008-12-09 08:15:21

13

並非所有可以包含在頁面中的控件都必須在服務器上運行。例如:

<INPUT type="submit" runat=server />

這在本質上是一樣的:

<asp:Button runat=server />

取下第一個RUNAT =服務器標籤,你必須在瀏覽器中運行一個標準的HTML按鈕。有理由反對在服務器上運行特定的控件,並且ASP.NET無法基於您包含的HTML標記「假設」您想要的內容。有可能爲<asp:XXX />控件系列「推斷」runat =服務器,但我的猜測是,微軟會考慮對標記語法和ASP.NET引擎進行破解。

+1

如果一個控件在服務器上運行,這是否意味着你不能選擇使用Javascript的元素?例如document.getElementsById( 「tvns:樹視圖」); – 2013-11-22 10:13:34

+2

該元素仍然位於客戶端的DOM中,因此仍可以使用javascript/jQuery對其進行修改。使用服務器呈現的元素可能會非常棘手,但是,對於動態控件尤其如此。 – 2013-11-22 12:40:16

3

我懷疑的是,它有在處理過程中如何識別服務器端控件。而不是必須在運行時檢查每個控件的名稱以確定是否需要完成服務器端處理,它會根據標記對內部節點表示進行選擇。編譯器檢查以確保所有需要服務器標籤的控件在驗證步驟中都有它們。

1

如果你在普通的html標籤上使用它,這意味着你可以在事件處理程序等中以編程方式操縱它們,例如,在頁面加載時更改錨點標籤的href或class ......只有在必須時,因爲香草html標籤走得更快。

就用戶控件和服務器控件而言,如果沒有他們,他們只是無法工作,沒有深入研究aspx預處理器的內部功能,不能確切地說出原因,但會猜測出於可能的原因,他們只是這樣寫解析器,尋找明確標記爲「做某事」的事情。

如果@JonSkeet在任何地方,他可能會提供更好的答案。

33

我通常不喜歡去猜測,但我會在這一個...

如果你還記得微軟的.NET營銷炒作早在一天(2001?),這是很難告訴.NET甚至是什麼。它是服務器嗎?一個編程平臺?一種語言?新的東西完全是?鑑於廣告,它含糊不清任何你想要的東西 - 它只是解決了你可能遇到的任何問題。

所以,我的猜測是存在一個隱藏的宏偉願景,即ASP.NET代碼可以在與.NET運行時綁定的Internet Explorer副本中的任意位置運行 - 服務器端或客戶端。 runat =「服務器」只是一個殘留物,留下來是因爲它的客戶端相當於從未生產過。

記住那些奇怪的廣告?

相關:Article from The Register與一些.NET的歷史。

+5

你碰巧有一個鏈接到一個網站,有任何的「奇怪的廣告」? – RandomWebGuy 2011-08-11 21:05:11

+0

是的,我記得那些奇怪的廣告。 *嘆* – catfood 2013-07-01 18:10:11

1

它在那裏,因爲ASP.NET中的所有控件都繼承自具有「runat」屬性的System.Web.UI.Control。

在類System.Web.UI.HTMLControl中,該屬性不是必需的,但是在System.Web.UI.WebControl類中該屬性是必需的。

編輯: 讓我更具體。由於asp.net幾乎是HTML的摘要,因此編譯器需要某種指令,以便它知道特定標記需要運行服務器端。如果該屬性不存在,則不知道先在服務器上處理它。如果它不在那裏,它會認爲它是正常的標記並將其傳遞給客戶端。

1

我認爲微軟可以通過在編譯頁面之前讓編譯器添加runat屬性來解決這個問題,類似於java對泛型的類型擦除,而不是擦除,它可能會寫入runat =服務器,無論它看到asp:標籤的前綴,所以開發人員不必擔心它。

0

將數據提交給ASP.NET Web服務器時,作爲Runat =「server」提到的控件將在Server Application中表示爲Dot Net對象。您可以在HTML控件中手動輸入代碼,也可以在設計視圖中右鍵單擊使用Run As Server選項。 一旦從通常HTML控件不需要的工具箱中拖動它,ASP.NET控件就會自動獲取該屬性。

-4

runat="Server"指示HTML「控件」會發送回服務器。

Web窗體不斷地使用postback來指示服務器處理頁面控制事件。

.NETMVC頁面請勿使用postback(表格"submit"除外)。MVC依靠JQUERY來管理客戶端的頁面(從而繞過了很多postback消息到服務器的需要)。

因此: .NET Web窗體...在頁面標記中使用"runat"屬性很多。

.NETMVC很少在頁面標記中使用"runat"屬性。

希望這有助於解釋,爲什麼runat是必要的......

1

在ASP.NET文件HTML元素,默認情況下,作爲文本處理。要使這些元素可編程,請將一個runat="server"屬性添加到HTML元素。該屬性表明該元素應該被視爲服務器控件。

5

微軟MSDN文章The Forgotten Controls: HTML Server Controls通過將其轉換爲<input type="text" id="Textbox1" runat="server">

Doing this will give you programmatic access to the HTML element on the server before the Web page is created and sent down to the client. The HTML element must contain an id attribute. This attribute serves as an identity for the element and enables you to program to elements by their specific IDs. In addition to this attribute, the HTML element must contain runat="server". This tells the processing server that the tag is processed on the server and is not to be considered a traditional HTML element.

總之解釋對文本框<input type="text">一個例子使用RUNAT =「服務器」中,啓用對HTML元素的編程訪問添加runat="server"到它。

0

相當多餘的屬性,考慮到「asp」標籤顯然是一個ASP元素,應該足以將其標識爲服務器端可訪問的元素。

其他地方,但它用於提升常用標籤用於代碼隱藏。

0

我剛剛通過反覆試驗得出了這個結論: 在服務器端運行時訪問元素需要runat =「server」。 刪除它們,重新編譯並觀察發生了什麼。

相關問題