2013-04-17 12 views
9

Próbując utworzyć niestandardowe źródło danych, które ma zostać użyte w środowisku ASP.NET, utworzyłem niestandardową klasę źródła danych, niestandardowy edytor i niestandardowy klasa serializowalna.Dlaczego moja projektowana właściwość nie jest serializowana w ASPX

Nie mogę zrozumieć, dlaczego to nie działa ... mimo że prawdopodobnie mam więcej atrybutów niż jest to wymagane (przeglądałem i próbowałem rzeczy przez wiele godzin), z tego co rozumiem, że powinno być zrobione PersistenceMode(PersistenceMode.InnerProperty) podstęp ... Wydaje mi się, że mój kod jest podobny do Why can't I declare sub-elements (properties) of a UserControl in a WebForm?.

Kod działa w następujący sposób:

[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; } 
} 

Zwyczaj edytor wydaje się działać: po użyciu go, właściwości VS są poprawnie zaktualizowane.

Jednak po aktualizacji coś informacja nie jest utrwalane w pliku ASPX:

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

Co spodziewałem był jakiś serializacji w źródle danych, np:

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

Może ktoś proszę wyjaśnić dlaczego to nie działa?

+1

Czy próbowałeś już bez niektórych atrybutów, na przykład TypeConverters? –

+0

Nie rozumiem, co próbujesz zrobić. Zasadniczo mówisz: mam trzy klasy i nie działają. Co próbujesz zrobić? Jakie jest twoje zachowane zachowanie i oczekiwane zachowanie? Oczekujesz jakiejś serializacji w źródle danych? Serializacja w klasie? Zwykle serializacja występuje wewnątrz pliku tekstowego lub binarnego. Moje następne pytanie brzmiałoby: Jaki plik? –

+0

W zasadzie próbuję utworzyć niestandardowy edytor klasy "ResultRequest". Źródło danych działa, po prostu nie mogę go skonfigurować z ASPX zamiast z kodu. The TypeConverters są tam, ponieważ domyślna serializacja (do twojego ASPX XML) nie działa - f.ex. podczas gdy ja wiem jak serializować "obiekt []", projektant nie, więc zamierzałem mu powiedzieć, jak to się robi. Po to też jest edytor. Tak, próbowałem dodawać i usuwać atrybuty godzinami, próbując zrozumieć, jak to działa (wniosek: nie działa i nie rozumiem tego). – atlaste

Odpowiedz

1

Proszę spojrzeć na moje próbki jest mniej skomplikowany tak byłoby łatwiej zrozumieć:

Pierwszą kontrolę nadrzędną (w Twoim przypadku będzie to 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; } 
    } 
} 

zwracać uwagę mam ustaw dla właściwości ChildrenAsProperties wartość false. I tu jest definicja dziecko, 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; 
     } 
    } 
} 

Teraz wewnątrz projektanta mogę zadeklarować TabContainer tak:

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

i wreszcie dodać formanty podrzędne, które zachowania Stan:

 <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> 

pozdrowieniami !

+0

Dzięki, ale myślę, że to naprawdę nie jest rozwiązanie: problem polega częściowo na tym, że 'object []' i 'Type' muszą być serializowane. 'IList ' z 'T' typem nadającym się seriale jest serializowalny i dlatego działa z' PersistenceMode', podczas gdy mój przykład nie. Najczęściej mam problem z łączeniem wszystkich tych atrybutów i rozumiem, jak je skleić ... Być może, gdybyś uczynił swój przykład nieco bardziej złożonym, byłby porównywalny? – atlaste

Powiązane problemy