2010-06-10 10 views
6

Ho creato il controllo utente. Ha proprietà pubblica string[] (potrebbe essere List<string> o qualsiasi altra cosa). Voglio supportare la definizione di questa proprietà nel codice aspx, quando dichiari l'istanza di questo usercontrol. Qualcosa del genere:ASP.NET elenco controllo utenti/raccolta/proprietà array

<uc1:MyControl ID="MyControl1" runat="server"> 
    <MyStringCollectionProperty> 
     <string>My String 1</string> 
     <string>My String 2</string> 
     <string>My String 3</string> 
    </MyStringCollectionProperty> 
</uc1:MyControl> 

Come farlo funzionare? Grazie ...

+1

Cosa stai cercando di raggiungere? Non puoi semplicemente impostare la proprietà nel code-behind? (es. MyControl1.MyCollection = new List {"Foo", "Bar"};) o, "runat =" server "/> – RPM1984

+0

Di cource, posso impostare la proprietà in code-behind, come" opzione emeregency ". Quello che voglio è separare la dichiarazione dell'interfaccia utente dalla logica. Per quanto riguarda la seconda opzione ("<% = new List ..."). Non funziona, perché i tag del server non possono contenere espressioni "<% %>". – zhe

risposta

0

Immettendo i valori delle variabili nel mark-up in modo esplicito, per il tuo esempio, stai combinando direttamente l'interfaccia utente con la tua logica.

Se questi valori non cambiano mai, quindi non ha senso inserirli nel mark-up - sarebbe meglio inserirli nel codice del controllo dell'utente.

Se questi valori possono essere diversi ogni volta che il controllo utente viene caricato, devono provenire da una sorgente dinamica, come variabili di stato sessione, variabili pubbliche, valori di controllo, ecc. (In tal caso, il controllo utente verrebbe cercale ogni volta che carica.)

Se questi valori cambiano solo in fase di progettazione, è comunque possibile impostarli come sopra, ma in questo caso potresti considerare di creare un "controllo personalizzato".

In ogni caso, non sono sicuro di quello che stai cercando di ottenere, quindi spero che una di queste opzioni possa aiutarti.

Buona fortuna

+0

In realtà questa proprietà non è strettamente connessa con la logica aziendale. Rappresenta solo una delle impostazioni di questo controllo utente. Tuttavia, l'impostazione di questa proprietà in page_load ora mi soddisfa. :) Grazie per il vostro consiglio. – zhe

1

Per quanto ne so, non si può fare quello che si vuole fare con un controllo utente. Dovresti scrivere un controllo personalizzato.

Vedere Server Control Properties Example su MSDN.

1

Ecco un esempio di come ottenere ciò che si sta chiedendo. I controlli figlio vengono letti come controlli HTMLGeneric, quindi è necessario convertirli. Mentre vengono letti, li converto nella mia classe personalizzata "StringControl". Se si desidera utilizzare una struttura più avanzata, è possibile semplicemente migliorare il costruttore per il controllo stringa.

Partial Class UserControlStrings_MyControl 
    Inherits System.Web.UI.UserControl 

    Private _MyStringCollectionProperty As New MyUserControlStringCollectionClass(Me) 

    <PersistenceMode(PersistenceMode.InnerProperty)> 
    Public ReadOnly Property MyStringCollectionProperty As MyUserControlStringCollectionClass 
     Get 
      Return _MyStringCollectionProperty 
     End Get 
    End Property 
End Class 

Public Class MyUserControlStringCollectionClass 
    Inherits ControlCollection 

    Sub New(ByVal owner As Control) 
     MyBase.New(owner) 
    End Sub 

    Public Overrides Sub Add(ByVal child As System.Web.UI.Control) 
     MyBase.Add(New StringControl(child)) 
    End Sub 
End Class 

Public Class StringControl 
    Inherits HtmlGenericControl 

    Sub New(ByVal GenericControl As HtmlGenericControl) 
     MyBase.New() 
     Me.Value = GenericControl.InnerHtml 
    End Sub 

    Public Property Value As String = String.Empty 

    Public Overrides Function ToString() As String 
     Return Value 
    End Function 
End Class 

Si può quindi cercare nella "MyControl1.MyStringCollectionProperty" per tutti i valori.

6

È possibile utilizzare TypeConverterAttribute per specificare una classe di convertitore (StringArrayConverter in questo caso).

Problemi correlati