0

我正在为一个项目制作一个表单框架,并发现当尝试以编程方式将 asp:Label 的AssociatedControlID属性设置为其关联的 TextBox 时,我必须调用ClientID来获取要填充的ID(不为空)。

在调试时,中间窗口的这种使用显示了问题:

_inputTextBox.ID
null
_inputTextBox.ClientID
"ctl00_MainContent_ctl01"
_inputTextBox.ID
"ctl01"

(第二次调用ID时存在值)

我在重写的CreateChildControls()中设置_inputLabel.AssociatedControlID = _inputTextBox.ID ,并在我的 WebControl的RenderContents()中进行了尝试。

我尝试先将ClientID加载到一个未使用的临时变量中,它可以工作,例如:

var x = _inputTextBox.ClientID;
_inputLabel.AssociatedControlID = _inputTextBox.ID;

给出:(正确)

<label for="ctl00_MainContent_ctl01">Name of customer</label>
<input type="text" id="ctl00_MainContent_ctl01" name="ctl00$MainContent$ctl01"/>

而不是:(不正确)

<span>Name of customer</span>
<input type="text" id="ctl00_MainContent_ctl01" name="ctl00$MainContent$ctl01"/>

我的问题是 - 为什么我必须执行这个 hack?是否有更好的方法可以可靠地填充ID ?

谢谢。

4

2 回答 2

1

除非在调用 RenderControl 方法之前明确定义,否则动态创建的控件的 ID 为 null。

于 2009-07-29T22:47:30.773 回答
1

最好的办法是自己在控件上设置 id。EnsureID如果您不这样做,则会在调用受保护的控件方法时自动生成一个。
此方法在不同时间自动调用,包括但不限于在ClientID访问 getter for 时。
您还应该知道,如果您正在动态操作控件,那么动态生成的 id 可能会根据您将控件添加到页面的顺序而有所不同。
此外,即使您没有动态创建控件,如果您ClientID以不同的顺序强制 id 生成(通过访问),动态生成的 id 也会有所不同。

于 2009-07-30T00:59:23.567 回答