2009-04-11 4 views
1

Le code HTML généré pour mon contrôle serveur ASP.net personnalisé génère l'attribut name pour les contrôles enfants, au lieu de l'attribut id. Quelque chose comme ceci:Attribut HTML 'name' généré pour les contrôles enfants ASP.net, au lieu de l'attribut unique 'ID'

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

L'ID pour le contrôle personnalisé lui-même est apparemment correct.

Ce qui est encore plus étrange pour moi, c'est que l'ID est généré parfois (je ne sais pas dans quelles conditions). Mais un FindControl() avec cet ID renvoie null du côté serveur. FindControl() avec la valeur de l'attribut name fonctionne très bien.

Quelque chose comme ceci:

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

Pour ce qui précède, FindControl("GridView2$ctl02$editdis$ctl00") fonctionne très bien, FindControl("GridView2_ctl02_editdis_ctl00") ne fonctionne pas.

Comment puis-je garantir des ID cohérents et prévisibles?

Répondre

3

Ils sont cohérents.

En interne, les contrôles qui sont les enfants d'un contrôle de dénomination (c'est-à-dire GridView) ont leurs ID complets créés en ajoutant les ID de leurs parents en utilisant "$". Dans le cas d'une grille, c'est gridID $ rowID $ cellID $ mycontrolID. Ceci est nécessaire pour différencier plusieurs instances du même contrôle enfant (c'est-à-dire mycontrolID). Pourquoi "$" et pas "_"? Je suppose que beaucoup de gens ont déjà tendance à nommer leurs contrôles "my_control_something" et le symbole "$" est aussi bon que tout. Donc, le GridView2 $ ctl02 $ editdis $ ctl00 est le bon ID et c'est pourquoi il est utilisé comme un nom pour les contrôles tels que INPUT. Lorsque la publication se produit, le framework doit être capable de faire correspondre les clés de formulaire avec les contrôles appropriés. La confusion avec les identifiants, je pense, vient du fait qu'un identifiant que vous utilisez dans .aspx et l'identifiant que vous voyez dans HTML sont deux choses différentes. Les identifiants côté client sont juste cela. Pour une raison quelconque, lorsqu'un contrôle est rendu (en utilisant la propriété ClientID), tous les "$" sont remplacés par "_". Ma conjecture est que ceci a été fait pour le rendre javascript/css amical.

Maintenant, à propos de ce FindControl ("GridView2 $ ctl02 $ editdis $ ctl00") ... Vous devriez vraiment essayer de l'éviter autant que possible. FindControl est une fonction récursive qui casse "GridView2 $ ctl02 $ editdis $ ctl00" en "GridView2" et "ctl02 $ editdis $ ctl00", trouve GridView2 et demande s'il a le "ctl02 $ editdis $ ctl00" comme contrôle enfant. Le processus se répète pour chaque partie séparée par $. Sur une note de côté, lorsque vous appelez Page.FindControl pour un contrôle profondément enfoui, vous devez examiner le motif et demander pourquoi. Par exemple, tout ce qui doit être fait avec le "GridView2 $ ctl02 $ editdis $ ctl00", très probablement doit être fait avec un "GridView2 $ ctl02 $ editdis $ ctl01" ainsi. Dans ce cas, il doit probablement être géré sur OnItemCreated ou sur OnItemDataBound, où vous avez accès à une ligne qui "connaît" à propos de "ctl00".

+0

Hmm. J'utilisais l'ID html (de REQUEST ["__ LASTFOCUS"]) pour restaurer le focus sur le bon contrôle de la page ASP.net. Je réalise maintenant qu'il n'y a pas de traduction aussi simple d'un identifiant à l'autre. Le remplacement de '_' par '$' sera-t-il portable sur les versions .net? – sandesh247

+0

Si je ne me trompe pas, toutes les versions .NET utilisent "_" pour les identifiants HTML et "$" pour les noms HTML et les ID en interne. – Ruslan

Questions connexes