.ClientIDを呼び出して.IDを取得し、Webコントロールに入力する必要がある

StackOverflow https://stackoverflow.com/questions/1203397

  •  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です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top