Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌入在页面上的用户控件更改控件的ClientID_C#_Asp.net_User Controls_Clientid - Fatal编程技术网

C# 嵌入在页面上的用户控件更改控件的ClientID

C# 嵌入在页面上的用户控件更改控件的ClientID,c#,asp.net,user-controls,clientid,C#,Asp.net,User Controls,Clientid,我有一个用户控件(.ascx),我正在将其嵌入我的页面(.aspx),如下所示: <%@ Register TagName="UI" TagPrefix="my" Src="~/userControls/UI.ascx" %> <my:UI runat="server" ID="mytestui" /> 加载页面时,用户控件内的控件(文本框、下拉列表等)会自动更改。假设我有一个名为txtest的文本框,它将更改为mytestui\u txtest 如您所见,它获取

我有一个用户控件(.ascx),我正在将其嵌入我的页面(.aspx),如下所示:

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

加载页面时,用户控件内的控件(文本框、下拉列表等)会自动更改。假设我有一个名为txtest的文本框,它将更改为mytestui\u txtest

如您所见,它获取上面的用户控件的ID并将其附加到控件


有什么方法可以防止这种情况发生吗?

之所以发生这种情况,是因为您的控件是
UserControl
类的子类,该类实现了
INamingContainer
接口。默认情况下,实现此接口的所有控件都会使用自己的ID预先设置子ID,从而确保页面上的每个ID都是唯一的

要避免这种行为,您有两种选择:

  • 创建服务器控件,不是从
    UserControl
    继承,而是直接从
    control
    类继承。此项不在MingContainer中实现
    。但是,您将没有标记文件,并且必须以编程方式生成所有控件

  • [编辑:仅限ASP.NET 4]对子控件使用
    clientMode=“Static”
    。此模式确保控件的服务器ID和客户端ID完全相同。在这种情况下,开发人员的任务是确保此控件在页面上只使用一次,以避免ID重复


  • 这是因为控件是
    UserControl
    类的子类,该类实现了
    INamingContainer
    接口。默认情况下,实现此接口的所有控件都会使用自己的ID预先设置子ID,从而确保页面上的每个ID都是唯一的

    要避免这种行为,您有两种选择:

  • 创建服务器控件,不是从
    UserControl
    继承,而是直接从
    control
    类继承。此项不在MingContainer中实现
    。但是,您将没有标记文件,并且必须以编程方式生成所有控件

  • [编辑:仅限ASP.NET 4]对子控件使用
    clientMode=“Static”
    。此模式确保控件的服务器ID和客户端ID完全相同。在这种情况下,开发人员的任务是确保此控件在页面上只使用一次,以避免ID重复



  • 您使用的是什么版本的.Net?如果>=4.0,您可以使用安德烈所说的
    clientmode=“Static”
    。您也可以在控件或页面级别进行设置。

    您使用的是什么版本的.Net?如果>=4.0,您可以使用安德烈所说的
    clientmode=“Static”
    。您也可以在控件或页面级别进行设置。

    谢谢您的回答,我不能选择第一个选项,因为我需要标记。对于第二个选项,我尝试了ClientIDMode。首先,它不在属性中,当我将它添加到asp:DropDown时,不会发生任何更改。您使用的是哪个版本的asp.NET?ClientID的模式只在第四节介绍。@Sam,那么恐怕除了第一节之外没有其他选择了。在ASP.NET第四版之前,冗长的ID一直是ASP.NET的一大难题。但也许你还可以接受这些?你到底想实现什么?基本上我正在做一个清理,并将UI移动到用户控件,但是用户控件是从其他部分类继承的,其中一个类是从usercontrol继承的。在其中一个示例中,我正在按名称查找一个id,比如Control=ValidationBase.FindControlRecursive(Page.Master??(Control)Page,id);这是个错误…@Sam,什么是错误?顺便说一句,我想你应该用这个信息更新这篇文章谢谢你的回答,我不能选择第一个选项,因为我需要标记。对于第二个选项,我尝试了ClientIDMode。首先,它不在属性中,当我将它添加到asp:DropDown时,不会发生任何更改。您使用的是哪个版本的asp.NET?ClientID的模式只在第四节介绍。@Sam,那么恐怕除了第一节之外没有其他选择了。在ASP.NET第四版之前,冗长的ID一直是ASP.NET的一大难题。但也许你还可以接受这些?你到底想实现什么?基本上我正在做一个清理,并将UI移动到用户控件,但是用户控件是从其他部分类继承的,其中一个类是从usercontrol继承的。在其中一个示例中,我正在按名称查找一个id,比如Control=ValidationBase.FindControlRecursive(Page.Master??(Control)Page,id);这是个错误…@Sam,什么是错误?顺便说一句,我想你应该用这些信息来更新这篇文章。我可以问一下为什么,你想用clientID实现什么吗?你传递的是什么ID,你想要的控件是如何定义的?从usercontrol传递ID我可以问一下为什么,你想用ClientID实现什么?你传递的是什么ID?你想要的控件是如何定义的?从UserControlID传递ID为什么你需要控件的原始ID?你想从客户端检索它们吗?请看Andrei的anserI的评论不明白,你能解释一下吗?那是Winway。。。不管怎样,您也可以比较控件的UniqueID属性,而不是只比较ID,这可能会起作用……为什么您需要控件的原始ID?你想从客户端检索它们吗?请看Andrei的anserI的评论不明白,你能解释一下吗?那是Winway。。。不管怎样,您也可以比较控件的UniqueID属性,而不是只比较ID,也许这样可以。。。