2013-06-26 35 views
0

我有一個用戶控件(.ascx),我在我的網頁(的.aspx)正在嵌入,如下:用戶控制改變客戶端ID的控制

<%@ Register TagName="UI" TagPrefix="my" Src="~/userControls/UI.ascx" %> 
<my:UI runat="server" ID="mytestui" /> 

當頁面被加載的用戶控件內的控件(文本框,下拉列表等)會自動更改。假設我有一個名爲txtTest的文本框,它將更改爲mytestui_txtTest。

正如您所看到的,它將上面的用戶控件的ID添加到控件中。

有什麼辦法可以防止這種情況發生?

+0

請問爲什麼,以及你想用ClientIDs實現什麼? – Alexander

+0

您傳遞了什麼ID以及您要查找的控件如何定義? – Andrei

+0

傳遞來自usercontrol的ID – Zaki

回答

2

發生這種情況是因爲您的控件是UserControl類的子類,它實現了INamingContainer接口。默認情況下,所有實現此接口的控件都會使用它們自己的ID預先填充子ID,從而確保頁面上的每個ID都是唯一的。

要aviod這種行爲,你有兩個選擇:

  1. 創建服務器控件,而不是從UserControl而是直接從Control類繼承。這一個不執行INamingContainer。但是,您不會有標記文件,並且必須以編程方式生成所有控件。

  2. [編輯:僅限ASP.NET 4]對子控件使用ClientIDMode="Static"。該模式確保控件的服務器和客戶端ID完全相同。在這種情況下,這是開發人員的工作,以確保此控件在頁面上僅使用一次,以避免ID重複。

+0

感謝您的答案,我不能去第一個選項,因爲我需要標記。對於第二個選項,我首先嚐試了ClientIDMode,它不在屬性中,當我將其添加到asp時,沒有任何更改:dropdown – Zaki

+0

您正在使用哪個版本的ASP.NET? ClientID模式僅在第四次推出。 – Andrei

+0

.NET Framework 2.0 – Zaki

1

您使用的是什麼版本的.Net?如果> = 4.0,您可以使用ClientIDMode="Static",正如Andrei所說。您也可以在控制或頁面級別進行設置。

+0

爲什麼你需要你的控件的原始ID?你是否試圖從客戶端檢索它們? – javitube

+0

請參閱Andrei's anser的評論 – Zaki

+0

您是否嘗試了yourParentControl.Find(id,True)? – javitube