2013-06-26 42 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