Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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# 如何修改CompositeControl的ClientId,消除对所述ID的呈现,而不影响ChildControls?_C#_Asp.net_.net 3.5 - Fatal编程技术网

C# 如何修改CompositeControl的ClientId,消除对所述ID的呈现,而不影响ChildControls?

C# 如何修改CompositeControl的ClientId,消除对所述ID的呈现,而不影响ChildControls?,c#,asp.net,.net-3.5,C#,Asp.net,.net 3.5,我有一个复合控件,可以呈现: <span id="controlID"> <span id="controID_propertyID"> <input id="controID_inputID"> 但是span和input具有相同的id <span id="controID_inputID"> <span id="controID_propertyID"> <input id="controID_inpu

我有一个复合控件,可以呈现:

<span id="controlID">
   <span id="controID_propertyID">
   <input id="controID_inputID">
但是span和input具有相同的id

<span id="controID_inputID">
   <span id="controID_propertyID">
   <input id="controID_inputID">
但这也破坏了我想要的属性Span的唯一性

<span>
   <span id="propertyID">   // I still want:  <span id="controlID_propertyID">
   <input id="controID_inputID">

//我仍然想要:
是否有一种方法可以实现我想要的,而不必将CompositeControl切换为网络控件。我还希望避免注入代码块,如:

 <label for="<%=control.ClientID%>_input">


或者通过代码隐藏、文本或其他类似的解决方法。

考虑更改控件的ClientMode-可以选择使子控件的ID“可预测”。


还有一件事:使用AssociatedControlID,在这里传递哪个控件?看起来您传递的是父对象本身,而不是子对象。

控件是如何定义的?如果看不到代码,我就帮不了你…@Ben public abstract class SaidControl:CompositeControl还需要其他细节吗?我可以根据需要重新定义它,但不能将其定义为网络控件。在RenderBeginTag的覆盖中,可以调用writer.AddAttribute来设置ID和其他属性。您应该提供CompositeControl类的代码,或者至少提供正在使用的标记。不清楚您正在使用什么以及如何使用。我正在返回子控件的ID:return\u input.ClientID;ClientMode看起来不错,但我也在使用3.5。这似乎是一项4.0+技术(是的,是的)也许可以尝试这样做:Control MyInput=MyCompositeControl.FindControl(“MyInputID”);返回MyInput.ClientID_输入是子控件,我似乎无法访问ClientMode。MSDN似乎没有为其他版本提供它。我也不想手动将ClientID从控件中拉出,我希望复合控件能够提供数据,这样标签就可以在标记vs pro语法中绑定。如果您想以某种方式将ClientID传递给标签,那么您现在必须知道ClientID。如我所见,有两种选择:1。您将ClientID属性传递给标签-这是您试图避免的事情,对吗?2.您可以查看呈现的标记,并确定您在浏览器中看到的ID就是您所需要的ID,所以只需将其放入asp.net标记的源代码中即可。第二种变体更糟糕,因为您实际上无法确定作为ClientID插入的字符串是否始终与实际字符串匹配。例如,您的网页可以转换为控件,也可以升级到.Net 4.0。
<span id="controID_inputID">
   <span id="controID_propertyID">
   <input id="controID_inputID">
    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.RenderBeginTag(HtmlTextWriterTag.Span);
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        writer.RenderEndTag();
    }
<span>
   <span id="propertyID">   // I still want:  <span id="controlID_propertyID">
   <input id="controID_inputID">
 <label for="<%=control.ClientID%>_input">