2012-01-22 14 views
9

Czy można uzyskać dostęp do właściwości nie zdefiniowanych w kontroli użytkownika? Chcę dodać dowolny atrybut html bez definiowania go w codebehind.asp.net Właściwości UserControl

ex:

<my:TextBox runat="server" extraproperty="extravalue" /> 

gdzie extraporperty niezdefiniowane w kontroli użytkownika, ale nadal generuje:

<input type="text" extraproperty="extravalue" /> 

muszę to w niestandardowym kontrolą użytkownika. Zauważ moje: przed polem tekstowym.

ty!

+0

Jak wygląda twój plik .ascx? –

Odpowiedz

7

Tak, jest to możliwe. Po prostu spróbuj!

Na przykład

<asp:TextBox ID="MyTextBox" runat="server" extraproperty="extravalue" /> 

renderuje jak:

<input name="...$MyTextBox" type="text" id="..._MyTextBox" extraproperty="extravalue" /> 

Edit

Z opinii:

asp: pole tekstowe nie jest kontrola użytkownika niestandardowego

Powyższe działa dla niestandardowego sterowania serwerem (pochodzącego z WebControl), ale nie dla UserControl, ponieważ UserControl nie ma znacznika, na którym można umieścić atrybut: renderuje tylko jego zawartość.

Potrzebowałbyś kodu w klasie UserControl, aby dodać swój atrybut niestandardowy do jednego z jego elementów podrzędnych. UserControl może następnie ujawnić atrybut niestandardowy jako właściwość, coś w rodzaju:

// Inside the UserControl 
public string ExtraProperty 
{ 
    get { return myTextBox.Attributes["extraproperty"]; } 
    set { myTextBox.Attributes["extraproperty"] = value; } 
} 

// Consumers of the UserControl 
<my:CustomUserControl ... ExtraProperty="extravalue" /> 
+2

asp: textbox nie jest niestandardową kontrolą użytkownika – LZW

+0

LZW co z tego? ________ – Evgeny

4

W rzeczywistości nie musisz zadeklarować właściwości, aby używać ich jako atrybutów. Weź to bardzo prosty przykład:

<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Register TagPrefix="uc" TagName="Test" Src="~/UserControls/Test.ascx" %> 

<uc:Test runat="server" extraproperty="extravalue" /> 

Wewnątrz pliku kodu kontrolą autora można uzyskać wartość z jakiejkolwiek własności jak ta:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string p = Attributes["extraproperty"]; 
} 

Jak widać, wszystkie atrybuty, które są umieszczone na dysku użytkownika formant można odczytać poprzez kolekcję Attributes, używając nazwy atrybutów jako klucza do pobrania wartości z kolekcji.

0

Tak, spójrz na interfejs IAttributeAccessor. obiekt ASP.NET UserControl jawnie implementuje ten interfejs. Dzięki temu wszelkie atrybuty dodane bezpośrednio do kontrolki w znacznikach zostaną przeniesione do kolekcji atrybutów po stronie serwera.

Należy zauważyć, że domyślna implementacja w UserControl nie jest możliwa do zastąpienia, ale zapisuje i odczytuje z kolekcji wewnętrznych atrybutów.Aby uczynić te atrybuty HTML w kontroli użytkownika, coś jak to zrobić w znacznikach:

<div runat="server" ID="pnlOutermostDiv"> 
// control markup goes here 
</div> 

następnie w opóźnieniem kodu kontroli użytkownika zrobić coś takiego:

protected override void OnPreRender(EventArgs e) 
{ 
    foreach (string key in Attributes.Keys) 
    { 
     pnlOutermostDiv.Attributes.Add(key, Attributes[key]); 
    } 

    base.OnPreRender(e); 
} 

Teraz kiedy używasz kontroli takiego:

<my:TextBox runat="server" extraproperty="extravalue" /> 

to uczyni tak:

<div id="ctl00_blablabla_blablabla" extraproperty="extravalue"> 
// rendered control HTML here 
</div>