J'écris un petit contrôle personnalisé ASP.Net héritant de CompositeControl. Le contrôle est juste un panneau contenant deux sous-panneaux avec une étiquette dans chaque sous-panneau. Une fois rendu, je vois dans la source HTML que le premier contrôle enfant de mon contrôle personnalisé obtient deux attributs id - le premier étant l'identifiant du contrôle personnalisé lui-même et le second étant la propriété ID que j'attribue au premier contrôle enfant. Pourquoi cela arrive-t-il?Pourquoi mon contrôle personnalisé ASP.Net rend-il deux attributs id sur mon premier contrôle enfant?
code:
[ToolboxData("<{0}:MessageBox runat=server></{0}:MessageBox>")]
public class MessageBox : CompositeControl {
private Panel _MessageHeaderContainer = null;
private Label _MessageHeaderLabel = null;
private Panel _MessageDetailsContainer = null;
private Label _MessageDetailsLabel = null;
protected override HtmlTextWriterTag TagKey {
get {
return HtmlTextWriterTag.Div;
}
}
protected override void CreateChildControls() {
// Message header area.
_MessageHeaderContainer = new Panel();
_MessageHeaderContainer.ID = "HeaderContainer";
_MessageHeaderContainer.CssClass = "__MessageBox_Container";
this.Controls.Add(_MessageHeaderContainer);
// Message header text.
_MessageHeaderLabel = new Label();
_MessageHeaderLabel.ID = "HeaderLabel";
_MessageHeaderLabel.Text = "[ Header ]";
_MessageHeaderContainer.Controls.Add(_MessageHeaderLabel);
// Message details area.
_MessageDetailsContainer = new Panel();
_MessageDetailsContainer.ID = "DetailsContainer";
this.Controls.Add(_MessageDetailsContainer);
// Message details text.
_MessageDetailsLabel = new Label();
_MessageDetailsLabel.ID = "DetailsLabel";
_MessageDetailsLabel.Text = "[ Details ]";
_MessageDetailsContainer.Controls.Add(_MessageDetailsLabel);
}
protected override void RenderContents(HtmlTextWriter output) {
AddAttributesToRender(output);
// Render the box.
_MessageHeaderContainer.RenderControl(output);
_MessageDetailsContainer.RenderControl(output);
}
}
Utilisation en page ASPX:
<cc:MessageBox ID="ctlMessageBox" runat="server" />
sortie HTML:
<div id="ctl00_ctl00_ctlMessageBox">
<div id="ctl00_ctl00_ctlMessageBox" id="ctl00_ctl00_ctlMessageBox_HeaderContainer" class="__MessageBox_Container">
<span id="ctl00_ctl00_ctlMessageBox_HeaderLabel">[ Header ]</span>
</div><div id="ctl00_ctl00_ctlMessageBox_DetailsContainer">
<span id="ctl00_ctl00_ctlMessageBox_DetailsLabel">[ Details ]</span>
</div>
</div>
Il semble aussi que toute propriété que je cède le contrôle lui-même (à savoir, this.CssClass = « xxxx ») est attribué, à la plus externe de contrôle, généré automatiquement div tag ainsi que rendu la balise div du premier contrôle enfant. –
Retrait de la ligne AddAttributesToRender (sortie) de l'arrêt de la fonction de rendu en ajoutant tous les attributs de l'étiquette de la racine à la première enfant. Je ne suis pas sûr de ce que le point de la fonction AddAttributesToRender est ... quelqu'un peut m'éclairer pour savoir pourquoi j'appellerais cette fonction? –
Vous l'appelleriez si vous vouliez plus de contrôle sur la façon dont vos rendus personnalisés de contrôle. Il ajoute les attributs qui doivent être affectés au contrôle personnalisé (style, etc., du balisage ASPX et d'autres sources) à la prochaine balise qui est rendu. Vous n'en avez pas besoin car vous laissez ASP.NET s'occuper du rendu. Si vous substituez la méthode Render (comme mon exemple), vous en aurez besoin. –