2009-04-15 51 views
3

我現在有點困惑。讓我解釋一下:爲什麼我沒有看到爲服務器端控件生成的ID?

我見過有人在討論在asp.net(3.5)的頁面中添加一個按鈕或其他控件,並且控件呈現它時會更改該控件的ID,例如。 Button1的成爲Button1_somethingsomething以防止它們使用jQuery,他們最終採用什麼是<%controlId.ClientId %>

所以我做了一個小測試

1. I added a button on the page: 
<form id="form1" runat="server"> 
<div> 
<asp:Button ID="Button1" runat="server" Text="Button" /> 
<div> 

2. Then I added a JavaScript and jQuery: 
<script type="text/javascript"> 
        $(document).ready(function() { 
        $("#Button1").click(function() { 
         alert("Hello world!"); 
        }); 

        }); 
       </script> 

3. The generated html is this: 
<div> 
    <input type="submit" name="Button1" value="Button" id="Button1" /> 
<div> 

現在這樣的東西,我沒有看到ASP.NET(ASP。淨3.5)改變ID。爲什麼我看到不同的行爲?

Btw。這在我點擊按鈕時起作用!

謝謝。

回答

9

ASP.NET僅在控件位於Naming Container的內部時更改ID。這可能包括某些用戶控件,來自母版頁的ContentPlaceHolders以及重複控件(Repeater,GridView等)

0

默認情況下,ASP.NET不會更改ID名稱,但當它們在主頁面的ContentPlaceHolder。所以這些名字最終會變成ctl00_ContentPlaceHolderContent_Button1。在你的情況下,沒有母版頁,也沒有改變。

0

這是由於INamingContainer接口某些控件(例如用於主頁面的asp:內容控件)實現的。

MSDN

實現這個 接口的任何控件創建在 一個新的命名空間,所有的子控件ID屬性 保證是一個 整個應用程序中是唯一的。由該接口提供的標記 允許 在 支持數據綁定的Web服務器控件內的動態生成的服務器控件實例 的唯一命名。這些控件 包括Repeater,DataGrid, DataList,CheckBoxList, ChangePassword,LoginView,Menu, SiteMapNodeItem和RadioButtonList 控件。

你的示例代碼不使用這些控件。您不使用ContentPlaceHolder的主頁面。您的ID不會因此而改變。

1

您可能不總是需要使用YourControl.ClientID,但它是很好的做法,這樣,如果當你的控件並結束了一個容器內,都不用回去收拾它。

相關問題