2009-11-03 4 views
5

J'ai remarqué que sur la plupart des contrôles Web standard de l'espace de noms System.Web.UI.WebControls, sinon tous, vous pouvez ajouter les propriétés souhaitées sans se bloquer. la page.Autorisation d'une propriété/attribut sur un serveur/usercontrol

Prenez l'asp: Bouton de contrôle pour un exemple.

Ce code est parfaitement valable:

<form runat="server"> 
    <asp:Button runat="server" Text="Test button" crapAttribute="crapValue" /> 
</form> 

Maintenant, j'ai un contrôle serveur personnalisé qui se bloque si j'ajouter des attributs arbitraires à lui. Il accepte uniquement les attributs qui ont une propriété publique correspondante définie. L'erreur que j'obtiens est quelque chose comme ceci "Le contrôle n'a pas de propriété publique nommée" crapAttribute "".

J'aimerais que mes contrôles personnalisés acceptent n'importe quel attribut sans se bloquer. Que dois-je faire pour que cela fonctionne? J'ai regardé les contrôles standard dans Reflector et ils ont toutes sortes d'attributs et d'autres choses, mais il n'y avait rien que j'ai vu qui a attiré mon attention immédiatement.

Mes contrôles personnalisés héritent de WebControl pour ce que cela vaut.

Répondre

4

Vous n'avez rien à faire en particulier pour autoriser l'ajout d'attributs arbitraires au balisage de contrôle. Les choses dérivant de WebControl normalement ramasser ces attributs et les vider dans la collection d'attributs.

Je ne peux pas penser à la raison pour laquelle cela échouerait. Vous devez vous rappeler de rendre la collection Attributes dans votre implémentation de Render si vous en avez un.

Pouvez-vous ajouter un exemple simple du code d'un nouveau contrôle qui échoue à votre question?

+1

Maintenant, je me sens comme un âne :-) Je réalise que je suis en fait héritant de « contrôle », non « WebControl ». Nous avions l'habitude d'hériter de "WebControl" mais il a été changé en "Contrôle" il y a un certain temps pour une raison quelconque. Je crois que si je commence juste à hériter de "WebControl", ce problème va juste cesser d'exister. – HaukurHaf

0

Une façon de le faire est d'ajouter la propriété personnalisée dans le code derrière

myCustomControl.Attributes.Add("customproperty", "value"); 

Cela devrait faire le travail pour vous.

Cependant, je suis intéressé à savoir comment le faire dans le contrôle du serveur lui-même.