2012-01-22 19 views
9

È possibile accedere a proprietà non definite nel controllo utente? Voglio aggiungere qualsiasi attributo html senza definirlo in codebehind.asp.net Proprietà UserControl

es:

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

dove extraporperty non definito nel controllo utente, ma genera ancora:

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

Ho bisogno di questo controllo utente personalizzato. Notare il mio: prima della casella di testo.

ty!

+0

Che aspetto ha il tuo .ascx? –

risposta

7

Sì, è possibile. Provalo!

Per esempio,

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

rende come:

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

Modifica

Dai commenti:

asp: textbox non è un controllo utente personalizzato

È possibile che lavorerà per un controllo server personalizzato (derivato da WebControl), ma non per un UserControl, perché un controllo utente non dispone di un tag su cui l'attributo può essere collocato: solo rende il suo contenuto.

Quindi è necessario il codice nella classe UserControl per aggiungere l'attributo personalizzato a uno dei relativi controlli figlio. L'UserControl potrebbe quindi esporre l'attributo personalizzato come proprietà, ad esempio:

// 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 non è un controllo utente personalizzato – LZW

+0

LZW e allora? ________ – Evgeny

4

In realtà non è necessario dichiarare proprietà per utilizzarle come attributi. Prendete questo esempio molto semplice:

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

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

All'interno file di codice di controllo utente è possibile ottenere il valore da qualsiasi proprietà come questa:

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

Come potete vedere, tutti gli attributi che vengono messi sul vostro utente il controllo può essere letto attraverso la collezione Attributes usando il nome degli attributi come chiave per ottenere il valore dalla collezione.

0

Sì, dai un'occhiata all'interfaccia IAttributeAccessor. l'oggetto UserControl ASP.NET implementa esplicitamente questa interfaccia. Ciò consente a qualsiasi attributo aggiunto direttamente al controllo nel markup di essere trasferito alla raccolta di attributi lato server.

Si noti che l'implementazione predefinita su UserControl non è sovrascrivibile, ma scrive e legge dalla sua raccolta di attributi interni.Per rendere questi attributi HTML nel controllo utente, fare qualcosa di simile nella marcatura:

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

poi nel code-behind del controllo utente fare qualcosa di simile:

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

    base.OnPreRender(e); 
} 

Ora, quando si utilizza il controllo in questo modo:

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

si renderà così:

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