2009-02-13 12 views
0

Je sais que dans la prochaine version d'ASP.NET, nous pourrons enfin définir les clientids sur les contrôles System.Web sans que le framework ne le fasse pour nous de manière quasi-intelligente, par exemple :Forcer les ID client dans ASP.NET

id="ctl00__loginStatus__profileButton" 

est-ce que quelqu'un sait une bonne méthode dans l'intervalle pour forcer l'ID ci-dessus à quelque chose comme

id="profileButton" 

la principale raison est la manipulation des clientids dans jQuery lors de l'ajout dynamiquement des contrôles à un page. Le problème que je peux voir est en train de changer les ID va casser le Viewstate?

Répondre

6

Ce que j'ai tendance à faire est de générer dynamiquement des méthodes javascript qui gèrent cela. Vous pouvez le faire dans le balisage ou le code derrière ainsi par exemple:

<script language="javascript" type="text/javascript"> 
function doXYZ() 
{ 
    $("#" + getListBoxId()).css(...) 
} 

function getListBoxId() 
{ 
return "<%=this.myListBox.ClientId>"; 
} 

</script> 

Vous pouvez également créer les fonctions dans le code derrière et les enregistrer.

EDIT

Il y a deux mois que je devais corriger l'id de certains contrôles serveur, j'ai réussi à le pirater et je l'ai décrit ma méthode ici here.

Fondamentalement, vous devez placer les contrôles dans un conteneur de nommage comme un contrôle utilisateur, puis remplacer quelques propriétés qui empêchent les contrôles enfants d'obtenir leur ID unique.

+0

Ma question était un peu clair, ce que je préfère est de pouvoir régler les ids donc je sais toujours ce qu'ils sont (au lieu d'avoir à utiliser une table de recherche sur le client, les identifiants client mappent à un autre type d'ID) –

+0

Je sais que j'ai essayé de trouver une solution similaire et j'ai rapidement décidé que cela ne valait pas la peine à l'époque. – JoshBerke

1

La performance n'est pas grande, mais vous pouvez utiliser cette syntaxe de sélection pour correspondre ClientIDs désordre:

$("[id$='_profileButton']") 

qui correspond à tout élément se termine dans _profileButton. L'ajout du trait de soulignement principal garantit que vous correspondez à l'élément souhaité et non à un autre élément qui se termine dans la sous-chaîne "profileButton" (par exemple "myprofileButton").

Comme il doit parcourir la totalité du DOM, les performances peuvent être médiocres si vous l'utilisez en boucle ou plusieurs fois à la fois. Si vous n'en abusez pas, l'impact sur les performances n'est pas très significatif.

0

Je me suis souvent heurté à ce "problème" en développant des webforms asp.net. Dans la plupart des cas, j'ai tendance à utiliser la classe css de l'élément. Avant de commencer à manipuler l'id: s, peut-être que c'est une façon de le gérer aussi? C'est une solution simple.

+0

Cela peut avoir les mêmes inconvénients de performance que la réponse de Dave (en l'utilisant dans une boucle, etc.). Le référencement par classe est beaucoup plus lent que par ID –

1

Une autre façon serait d'envelopper votre contrôle avec un div ou span avec un id statique, puis accéder au contrôle à travers cela.

Par ex

<span id="mySpan"> 
<asp:TextBox id="txtTest" runat="server" /> 
</span> 

Vous pouvez ensuite cibler les tags d'entrée dans MySpan. (même si je suis d'accord, il serait bien de pouvoir spécifier un joli nom, à condition de pouvoir gérer les conflits de noms ...)

0

Il existe une autre solution non mentionnée qui consiste à sous-classer l'ASP.NET contrôles et forcer les ID:

public class MyCheckBox : CheckBox 
{ 
    public string ForcedId { get;set; } 

    public override string ID 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(ForcedId)) 
       return ForcedId; 
      else 
       return base.ID; 
     } 
     set 
     { 
      base.ID = value; 
     } 
    } 

    public override string ClientID 
    { 
     get 
     { 
      return ID; 
     } 
    } 
} 

Utilisez ensuite cette où vous savez que les ID ne sera jamais entrer en conflit:

<mytag:MyCheckBox ForcedId="_myCheckbox" runat="server" /> 

Si vous utilisez des listes, vous devrez écrire un ListControlAdapter, et aussi adaptateurs pour chaque type de liste que vous utilisez (liste déroulante, case à cocher, radiobutton, listbox). Vous pouvez également croiser les jambes et attendre .NET 4.0.

7

Vous devez utiliser l'attribut ClientIDMode:

<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/> 
Questions connexes