2009-04-11 15 views
1

カスタムASP.netサーバーコントロール用に生成されたHTMLコードは、id属性の代わりに子コントロールのname属性を生成します。このようなもの:独自の「ID」属性の代わりにASP.netの子コントロール用に生成されたHTML「name」属性

<span id="GridView2_ctl02_editdis"> 
    <input type="text" name="GridView2$ctl02$editdis$ctl00"/> 
</span> 

カスタムコントロール自体のIDは明らかに適切です。

私には見知らぬ人ですが、IDが生成されるのは、時には(私はどのような条件ではわかりません)です。しかし、そのIDを持つFindControl()はサーバー側でnullを返します。 FindControl()のname属性の値はうまくいきます。このような

何か:上記の場合

<span class="TextBox" id="GridView2_ctl02_editdis"> 
    <input type="text" id="GridView2_ctl02_editdis_ctl00" name="GridView2$ctl02$editdis$ctl00"/> 
</span> 

、正常に動作しますFindControl("GridView2$ctl02$editdis$ctl00")FindControl("GridView2_ctl02_editdis_ctl00")はしていません。

一貫性のある予測可能なIDを確認するにはどうすればよいですか?

答えて

3

これらは一致しています。

内部的には、ネーミングコントロール(つまりGridView)の子であるコントロールは、親のIDを「$」で追加してフルIDを作成します。グリッドの場合は、gridID $ rowID $ cellID $ mycontrolIDです。これは、同じ子コントロールの複数のインスタンス(つまり、mycontrolID)を区別するために必要です。なぜ "$"で、 "_"ではないのですか?多くの人がすでに自分のコントロールに "my_control_something"という名前を付ける傾向があり、 "$"記号はいずれのものと同じくらい良いので、推測します。

したがって、GridView2 $ ctl02 $ editdis $ ctl00は正しいIDです。そのため、INPUTなどのコントロールの名前として使用されています。ポストバックが発生すると、フレームワークはフォームキーと適切なコントロールを一致させる必要があります。

IDとの混乱は、あなたが.aspx内で使用しているIDとHTMLで見られるIDが2つの異なることであると思います。クライアント側のIDはまさにそのIDです。何らかの理由で、コントロールが(ClientIDプロパティを使用して)レンダリングされると、すべての "$"が "_"に置き換えられます。私の推測では、これはjavascript/cssにするために行われたことです。

ここで、FindControlについて( "GridView2 $ ctl02 $ editdis $ ctl00")...できるだけ避けてください。 FindControlは、 "GridView2 $ ctl02 $ editdis $ ctl00"を "GridView2"と "ctl02 $ editdis $ ctl00"に分割し、GridView2を見つけて子コントロールとして "ctl02 $ editdis $ ctl00"を持っているかどうかを尋ねる再帰関数です。このプロセスは、$で区切られた部分ごとに繰り返されます。

Page.FindControlを深く掘り下げたコントロールのために呼び出すときはいつでも、パターンを調べて理由を尋ねる必要があります。たとえば、 "GridView2 $ ctl02 $ editdis $ ctl00"で何が行われる必要があるかは、 "GridView2 $ ctl02 $ editdis $ ctl01"で行う必要があります。その場合は、OnItemCreatedまたはOnItemDataBoundで処理する必要があります。OnItemDataBoundでは、「ctl00」を「知っている」行にアクセスできます。

+0

Hmm。私はASP.netページから適切なコントロールにフォーカスを復元するために、REQUEST ["__ LASTFOCUS"]からのhtml IDを使用していました。私は今、あるIDから別のIDへのそのような直接的な変換がないことを認識しています。 '_'を '$'に置き換えることは.netバージョン間で移植可能ですか? – sandesh247

+0

私が間違っていないならば、すべての.NETバージョンはHTML IDには "_"を使用し、内部的にはHTML名とIDに "$"を使用します。 – Ruslan

関連する問題