2013-04-17 15 views
9

Nel tentativo di creare un'origine dati personalizzata che dovrebbe essere utilizzata in ASP.NET, ho creato una classe di origine dati personalizzata, un editor personalizzato e una personalizzata classe serializzabile.Perché la proprietà del mio designer non è serializzata nell'ASPX

Quello che non riesco a capire è perché non funziona ... anche se probabilmente ho più attributi del necessario (ho navigato e provato cose per ore), da quello che ho capito il PersistenceMode(PersistenceMode.InnerProperty) avrebbe dovuto fare il trucco ... Inoltre, mi sembra che il mio codice sia simile a Why can't I declare sub-elements (properties) of a UserControl in a WebForm?.

Il codice funziona come segue:

editor di
[ParseChildren(true)] 
[PersistChildren(true)] 
public class MyDataSource : DataSourceControl 
{ 
    // [much more irrelevant code...] 

    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [MergableProperty(false)] 
    [TypeConverter(typeof(ExpandableObjectConverter))] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [Editor(typeof(Editors.ResultRequestEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    public ResultRequest Request { get; set; } 
} 

[Serializable] 
[PersistChildren(true)] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
[ParseChildren(true)]  
public class ResultRequest 
{ 
    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    public string ColumnName { get; set; } 

    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    public Type ColumnType { get; set; } 

    [Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    public object[] ResultTypeParameters { get; set; } 
} 

L'usanza sembra funzionare: dopo l'uso, le proprietà di VS vengono aggiornati correttamente.

Tuttavia, dopo l'aggiornamento qualcosa l'informazione non viene mantenuto nel file ASPX:

<cc1:MyDataSource ID="SearchDataSource1" runat="server" ProviderID="MyProvider1" /> 

Quello che mi aspettavo era una serializzazione all'interno dell'origine dei dati, ad esempio:

<cc1:MyDataSource ID="SearchDataSource1" runat="server" ProviderID="MyProvider1"> 
    <Request> 
     // blah 
    </Request> 
</cc1:MyDataSource> 

Qualcuno può spiegare perché questo non funziona?

+1

Hai provato senza alcuni attributi, ad esempio i TypeConverters? –

+0

Non capisco cosa stai cercando di fare. In linea di massima stai dicendo: ho tre classi e non funzionano. Cosa stai cercando di fare? Qual è il tuo comportamento obesizzato e il tuo comportamento previsto? Ti aspetti qualche serializzazione nell'origine dati? Serializzazione in una classe? Normalmente la serializzazione avviene all'interno di un file di testo o binario. Quindi la mia prossima domanda sarebbe: quale file? –

+0

Fondamentalmente sto provando a creare un editor personalizzato per la classe 'ResultRequest'. La stessa fonte di dati funziona, non riesco a farla configurare dall'ASPX invece del codice sottostante. I TypeConverters sono lì perché la serializzazione predefinita (per il tuo XML ASPX) non funziona - f.ex. mentre so come serializzare 'oggetto []', il progettista no, quindi intendevo dirgli come è fatto. Questo è anche ciò che l'editor è per. Sì, ho provato ad aggiungere e rimuovere attributi per ore nel tentativo di capire come funziona (conclusione: non funziona e non lo capisco). – atlaste

risposta

1

Si prega di dare un'occhiata al mio campione è meno complessa in modo sarebbe più facile da capire:

controllo primo genitore (nel tuo caso questo sarebbe DataSource):

[ToolboxData("<{0}:TabContainer runat=server></{0}:TabContainer>")] 
[ParseChildren(ChildrenAsProperties = false)] 
[PersistChildren(true)] 
public class TabContainer : Panel, INamingContainer 
{ 

    #region private properties 

    List<TabItem> tabs = new List<TabItem>(); 

    #endregion 

    [Bindable(true)] 
    public event EventHandler TabClick; 

    [Browsable(true)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public List<TabItem> Tabs 
    { 
     get { return this.tabs; } 
    } 
} 

preavviso Prendere Ho imposta ChildrenAsProperties su false. E qui è la definizione bambino, TabItem:

public class TabItem : Panel, IPostBackEventHandler 
{ 


    String clientClick = String.Empty; 

    public event EventHandler Click; 


    [Bindable(true)] 
    [Category("Appearance")] 
    public string Text 
    { 
     get 
     { 
      if (ViewState["Text"] == null) 
      { 
       ViewState["Text"] = ""; 
      } 
      return (string)ViewState["Text"]; 
     } 
     set 
     { 
      ViewState["Text"] = value; 
     } 
    } 
} 

Ora all'interno progettista posso dichiarare TabContainer in questo modo:

 <cc1:TabContainer ID="TabContainer1" runat="server" 
     </cc1:TabContainer> 

E infine aggiungere controlli figlio che conservano Stato:

 <cc1:TabContainer ID="TabContainer1" runat="server" 
      OnTabClick="TabContainer_TabClick"> 
      <Tabs> 
       <cc1:TabItem ID="Tab1" Text="Hello" runat="server" /> 
       <cc1:TabItem ID="Tab2" Text="World" runat="server" /> 
      </Tabs> 
     </cc1:TabContainer> 

Cordiali saluti !

+0

Grazie, ma penso che non sia davvero una soluzione: il problema è in parte il fatto che 'object []' e 'Type' devono essere serializzati. 'IList ' con 'T' un tipo serializzabile è serializzabile e quindi funziona con' PersistenceMode', mentre il mio esempio no. Per lo più ho problemi a combinare tutti questi attributi e capire come incollarli tutti insieme ... Forse se rendessi il tuo esempio un po 'più complesso, sarebbe comparabile? – atlaste

Problemi correlati