必须调用.ClientID才能获取.ID以填充Web控件
-
05-07-2019 - |
题
我正在为一个项目制作一个表单框架,并且发现在尝试以编程方式将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。
不隶属于 StackOverflow