2009-05-10 10 views
5

Je cherche à ajouter des pages maîtres à un site existant mais j'ai constaté qu'une fois que je le fais, les ID des éléments sont précédés d'un code (par exemple, ctl00_MainPageContent_). Malheureusement, cela casse les scripts existants sur la page qui utilisent l'ID d'élément original non modifié.Est-il possible d'empêcher les pages maîtres de modifier les ID d'élément?

Je me rends compte que je peux le remplacer par <%= Element.ClientID %> mais ce serait génial si je pouvais tout à fait désactiver ce comportement.

Alors, puis-je conserver les ID d'origine?

Répondre

5

La question a déjà été répondu dans le post précédent: Remove MasterPage Generated ID

La solution remplace l'événement rendu avec le code suivant:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
    Dim Html As New StringWriter() 
    Dim Render As New HtmlTextWriter(Html) 
    MyBase.Render(Render) 
    writer.Write(Html.ToString().Replace("name=""ctl00$ContentBody$", _ 
        "name=""").Replace("id=""ctl00_ContentBody_", "id=""")) 
End Sub 
+0

Approche intéressante. Y a-t-il des considérations de performance pour attraper la sortie de la page entière comme ça? Ou des problèmes possibles avec des changements à la convention de nommage dans le futur? –

+0

Le hit de performance est négligeable dans ce cas. Toutefois, cela doit être considéré comme une solution de contournement et non comme une solution permanente, car vous contournez la façon dont les pages maîtres génèrent des ID uniques. Néanmoins, un point positif est que si la convention de nommage pour les éléments de la page maîtresse change à l'avenir, il suffit de faire une modification sur l'événement Render. –

+0

Vous ne savez pas si c'est le chemin à parcourir ... Le codage en dur est mauvais et si vous réorganisez les conteneurs, la logique se casse. – Ben

4

Vous pouvez remplacer ClientID et UniqueID dans les contrôles. Ceci est de here, un article de Rick Strahl.

public override string UniqueID 
{ 
    get 
    { 
     return this.ID; 
    } 
} 

public override string ClientID 
{ 
    get 
    { 
     return this.ID; 
    } 
} 
+0

C'est aussi une idée intéressante, mais je ne pense pas que ça marchera pour moi car il y a de sérieuses limitations avec les postbacks et j'essaye de limiter les changements que je devrais apporter au code existant base. Merci! –