2009-11-03 17 views
5

Zauważyłem, że na większości, jeśli nie we wszystkich, standardowych kontrolkach internetowych w przestrzeni nazw System.Web.UI.WebControls, można dodawać dowolne właściwości, które mają do nich bez awarii Strona.Umożliwianie dowolnej właściwości/atrybutu na serwerze/kontrolerze użytkownika

Przejmij kontrolę asp: Button dla przykładu.

Ten kod jest całkowicie poprawny:

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

Teraz mam kontrolę serwera niestandardowy, który rozbija jeśli dodać dowolne atrybuty do niego. Akceptuje tylko atrybuty, które mają zdefiniowaną odpowiednią własność publiczną.

Otrzymany błąd jest podobny do następującego: "Kontrola nie ma publicznej właściwości o nazwie" crapAttribute "".

Chciałbym, aby moje niestandardowe formanty akceptowały dowolny atrybut bez awarii. Co muszę zrobić, aby to zadziałało?

Przyjrzałem się standardowym elementom sterującym w Reflectorze i mają one wszystkie rodzaje atrybutów i innych rzeczy, ale nic nie zobaczyłem, co od razu rzuciło mi się w oczy.

Moje niestandardowe elementy sterujące dziedziczą z WebControl, aby uzyskać wartość.

Odpowiedz

4

Nie musisz robić nic szczególnego, aby umożliwić dodawanie atrybutów arbitralnych do znaczników kontroli. Rzeczy pochodzące z WebControl normalnie zgarniają te atrybuty i zrzucają je w kolekcji Atrybuty.

Nie mogę wymyślić przyczyny, dla której to się nie powiedzie. Musisz pamiętać, aby renderować kolekcję Attributes w swojej implementacji Render, jeśli ją posiadasz.

Czy możesz dodać prosty przykład kodu nowego elementu sterującego, który nie odpowiada Twojemu pytaniu?

+1

Teraz czuję się jak osioł :-) Uświadomiłem sobie, że w rzeczywistości dziedziczę po "kontroli", a nie "WebControl". Kiedyś odziedziczyliśmy po "WebControl", ale jakiś czas temu zmieniono ją na "Control". Wierzę, że jeśli zacznę dziedziczyć po "WebControl", ten problem przestanie istnieć. – HaukurHaf

0

Jednym ze sposobów jest dodanie właściwość niestandardową w kodzie za

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

Powinno to zrobić dla ciebie zadanie.

Jednak jestem zainteresowany wiedzą, jak to zrobić w samym sterowniku serwera.

Powiązane problemy