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

在调试时,使用中间窗口会显示问题:

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

(第二次出现值 ID

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

我已经尝试首先将 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"/>

我的问题是 - 为什么我必须执行此黑客攻击?是否有更好的方法可以可靠地填充 ID

感谢。

有帮助吗?

解决方案

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top