2009-04-11 51 views
1

爲我的自定義ASP.net服務器控件生成的HTML代碼爲子控件生成name屬性,而不是id屬性。類似這樣的:生成的ASP.net子控件的HTML「name」屬性代替唯一的「ID」屬性

<span id="GridView2_ctl02_editdis"> 
    <input type="text" name="GridView2$ctl02$editdis$ctl00"/> 
</span> 

自定義控件本身的ID顯然是正確的。

什麼是更奇怪的是,這個ID確實產生了有時(我不知道在什麼條件下)。但帶有該ID的FindControl()在服務器端返回null。 FindControl()與名稱屬性的值工作得很好。

事情是這樣的:

<span class="TextBox" id="GridView2_ctl02_editdis"> 
    <input type="text" id="GridView2_ctl02_editdis_ctl00" name="GridView2$ctl02$editdis$ctl00"/> 
</span> 

針對上述情況,FindControl("GridView2$ctl02$editdis$ctl00")做工精細,FindControl("GridView2_ctl02_editdis_ctl00")沒有。

如何確保一致且可預測的ID?

回答

3

它們是一致的。

在內部,作爲命名控件(即GridView)子項的控件,通過使用「$」添加其父項的ID來構建其完整ID。如果是網格,則爲gridID $ rowID $ cellID $ mycontrolID。這是區分同一子控件的多個實例(即mycontrolID)所必需的。爲什麼「$」而不是「_」?我猜是因爲很多人已經傾向於將他們的控件命名爲「my_control_something」,而「$」符號與任何其他的一樣好。

因此,GridView2 $ ctl02 $ editdis $ ctl00是正確的ID,這就是爲什麼它用作控件的名稱,如INPUT。回發時,框架需要能夠將表​​單鍵與適當的控件進行匹配。

與ID混淆,我認爲,來自這樣一個事實,即您在.aspx中使用的ID和您在HTML中看到的ID是兩個不同的事物。客戶端的ID就是這樣。無論出於何種原因,當控件呈現時(使用ClientID屬性),所有「$」都被替換爲「_」。我的猜測是,這是爲了使javascript/css友好。

現在,關於該FindControl(「GridView2 $ ctl02 $ editdis $ ctl00」)...你真的應該儘量避免它,只要有可能。 FindControl是一個遞歸函數,它將「GridView2 $ ctl02 $ editdis $ ctl00」分解爲「GridView2」和「ctl02 $ editdis $ ctl00」,發現GridView2並詢問它是否具有「ctl02 $ editdis $ ctl00」作爲子控件。每個由$分隔的部分重複該過程。

在附註中,每當您發現自己調用Page.FindControl獲取某些深度控制時,您需要檢查該模式並詢問原因。例如,無論需要使用「GridView2 $ ctl02 $ editdis $ ctl00」來完成,最有可能需要使用「GridView2 $ ctl02 $ editdis $ ctl01」來完成。在這種情況下,可能需要在OnItemCreated或OnItemDataBound上進行處理,在這裏您可以訪問「知道」關於「ctl00」的行。

+0

嗯。我正在使用html ID(來自REQUEST [「__ LASTFOCUS」))將焦點從ASP.net頁面恢復到正確的控件。我現在意識到從一個ID到另一個不存在這樣直接的翻譯。 用'$'替換'_'是否可以跨.net版本移植? – sandesh247 2009-04-11 18:53:13