0

プロジェクトのフォームフレームワークを作成していますが、asp:LabelのAssociatedControlIDプロパティを関連するTextBoxにプログラムで設定しようとすると、 ClientIDを呼び出してIDを取得する必要があることがわかりました(nullではありません)。

デバッグ中、この中間ウィンドウの使用は問題を示しています。

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

(2回目の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"/>

私の質問は-なぜこのハックを実行しなければならないのですか?IDを確実に入力するためのより良い方法はありますか?

ありがとう。

4

2 に答える 2

1

動的に作成されたコントロールの ID は、RenderControl メソッドが呼び出されるまで明示的に定義されていない限り、null です。

于 2009-07-29T22:47:30.773 に答える
1

最善の方法は、自分でコントロールに ID を設定することです。そうしないと、コントロールの保護されたEnsureIDメソッドが呼び出されたときに自動的に生成されます。
このメソッドは、getter がアクセスされたときなど、さまざまなときに自動的に呼び出されClientIDます。
また、コントロールを動的に操作している場合、ページにコントロールを追加する順序によって、動的に生成される ID が異なる可能性があることにも注意してください。
また、コントロールを動的に作成していない場合でもClientID、別の順序で ( にアクセスして) ID 生成を強制すると、動的に生成された ID が変わる可能性があります。

于 2009-07-30T00:59:23.567 に答える