.ClientIDを呼び出して.IDを取得し、Webコントロールに入力する必要がある
-
05-07-2019 - |
質問
プロジェクトのフォームフレームワークを作成していますが、asp:Labelの AssociatedControlID プロパティをプログラムで関連付けられたTextBoxに設定しようとすると、 ClientID を使用して、 ID を取得します(nullではない)。
デバッグ中、この中間ウィンドウの使用は問題を示します:
_inputTextBox.ID
null
_inputTextBox.ClientID
"ctl00_MainContent_ctl01"
_inputTextBox.ID
"ctl01"
( ID が2回呼び出されると値が存在する)
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が異なる可能性があることに注意してください。
また、コントロールを動的に作成していない場合でも、( ClientID
にアクセスして)ID生成を別の順序で強制すると、動的に生成されるIDが変わる可能性があります。
他のヒント
RenderControlメソッドが呼び出されるまで明示的に定義されていない限り、動的に作成されたコントロールのIDはnullです。