2008-09-22 5 views
7

Si je veux manipuler les propriétés d'une balise HTML sur le serveur dans une page ASPX basée sur une page maître-à-direHTML Tag ClientID dans un projet .NET

<a href="#" runat="server" ID="myLink">My Link</a> 

Par exemple, pour donner le lien une classe différente selon sur la page en cours à savoir

if (Path.GetFileName(Request.PhysicalPath) == "MyPage") 
{ 
myLink.Attributes.Add("class","active"); 
} 

.NET modifie la propriété ID du lien vers quelque chose comme

<a href="#" ID="ct100-foo-myLink">My Link</a> 

Y a-t-il un moyen d'empêcher cela de se produire et de conserver l'identifiant d'origine? Merci d'avance

Répondre

2

AFAIK il n'y a aucun moyen.

Il montre l'arborescence de contrôle actuelle, qui est dans ce cas masterpage-content-control.

Cependant, si vous ajoutez un ID à la page maître (this.ID = "quelquechose") alors vous verrez "quelquechose" au lieu de ctl00 (ce qui signifie que l'index de contrôle 0).

+0

juste ce que je cherchais, merci! – sarsnake

0

Cependant, vous voudrez probablement conserver le nom d'origine afin de pouvoir manipuler le contrôle avec javascript .... si c'est le cas, vous devriez regarder dans ClientID; il renverra l'identifiant attribué lors de l'exécution.

EDIT:

On dirait qu'il ya une façon de le faire, mais avec un peu de travail ... jeter un oeil à ASP.NET Controls - Improving automatic ID generation : Architectural Changes (Part 3)

Je ne l'ai pas lu le post complet, mais il On dirait qu'il a créé son propre conteneur et son propre fournisseur de noms. Je pense que si vous vouliez laisser intact le nom de votre contrôle, vous suffit de retourner le nom de retour dans

public abstract string SetControlID(string name, System.Web.UI.Control control); 
0

Je ne ai jamais compris comment empêcher .NET de faire cela, mais ce que j'ai commencé à faire était de placer asp : Littéraux et en utilisant C# pour ajouter un WebControl à eux. Si vous écrivez un WebControl, vous pouvez définir différentes propriétés sans obtenir l'ID unique de .NET. Par exemple:

<asp:Literal ID="myLink" /> 

...

WebControl a = new WebControl(HtmlTextWriterTag.A); 
a.CssClass = "active"; 
a.Attributes["href"] = "#"; 
Literal text = new Literal(); 
text.Text = "click here"; 
a.Controls.Add(text); 
myLink.Controls.Add(a); 

Ce qui se traduira par le code html suivant:

<a href="#" class="active">click here</a> 

Dans l'ensemble, une solution assez sale, mais je ne savais pas ce que autre chose à faire à ce moment-là et j'avais une date limite pour me rencontrer. ;)

0

Oui, nous allons devoir conserver l'ID d'origine pour des raisons JavaScript et CSS. J'ai remarqué la propriété ClientId mais il est en lecture seule et ne peut pas être affecté, donc je ne suis pas sûr de la façon dont je l'utiliserais?

0

Ce billet de blog pourrait être utile: Remove Name Mangling from ASP.Net Master Pages (get your ID back!)

La solution dans le post de la méthode .getElementById écrase, vous permettant de rechercher l'élément juste en utilisant l'ID normal. Peut-être que vous pouvez l'adapter à vos besoins.

Avertissement: Ce comportement ASP.NET est voulu par la conception et c'est bien ainsi, même pour les contrôles serveur HTML comme le contrôle dans votre exemple. Server-ID et Client-ID sont deux choses très différentes, qui ne doivent pas être mélangées. En utilisant Master Pages ou User Controls, vous pourriez vous retrouver avec des ID de client identiques s'il n'y avait pas ce mécanisme.

4

Ce n'est pas possible directement. Vous pouvez créer un nouveau contrôle qui hérite du lien et remplacer son ID client pour renvoyer directement l'ID. Mais cela semble être exagéré. Vous pouvez simplement utiliser le balisage HTML et utiliser <% # GetClass()%> pour ajouter la classe lorsque vous en avez besoin.

En ce qui concerne l'utilisation de Javascript ClientID pour:

<a ID="myLink" runat="server">.... 


var ctrl = document.getElementById('<%# myLink.ClientID %>'); 

Bien sûr vous avez besoin quelque part un DataBind dans le code.

+0

+1. Je l'ai fait avec succès de cette façon avant. – Raithlin

+0

Merci, je vais voir si je peux obtenir cette solution. Essayer d'être aussi peu "hacky" que possible –

+0

Ce n'est sûrement pas "hacky" :) C'est en fait le but de la propriété ClientID. – rslite

0

Pourquoi ne pas simplement utiliser un tag standard, et utiliser des blocs de rendu pour le modifier, puis son comportement est bloqué sur le client.

1

Je viens de découvrir un moyen facile de le faire si vous utilisez jQuery.

var mangled_name = $("[id$=original_name]").attr("id"); 

Donc, si vous avez un contrôle serveur comme ceci:

<asp:TextBox ID="txtStartDate" runat="server" /> 

Vous pouvez obtenir le nom mutilée dans votre jQuery/Javascript avec:

var start_date_id = $("[id$=txtStartDate]").attr("id"); 

Puisqu'il est une chaîne, vous pouvez également l'utiliser "inline" au lieu de l'assigner, par exemple concaténant avec d'autres éléments pour les sélecteurs.

Questions connexes