【问题标题】:Why isn't my designer property serialized in the ASPX为什么我的设计器属性没有在 ASPX 中序列化
【发布时间】:2013-04-10 02:34:49
【问题描述】:

为了创建一个应该在 ASP.NET 中使用的自定义数据源,我创建了一个自定义数据源类、一个自定义编辑器和一个自定义可序列化类。

我不明白为什么它不起作用......即使我可能有比要求更多的属性(我已经浏览和尝试了几个小时),据我了解 PersistenceMode(PersistenceMode.InnerProperty) 应该有成功了......另外,在我看来我的代码类似于Why can't I declare sub-elements (properties) of a UserControl in a WebForm?

代码工作如下:

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

自定义编辑器似乎工作:使用它后,VS中的属性正确更新。

但是,在更新某些内容后,信息不会保留在 ASPX 文件中:

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

我期望的是数据源中的一些序列化,例如:

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

谁能解释一下为什么这不起作用?

【问题讨论】:

  • 您是否尝试过不使用某些属性,例如 TypeConverters?
  • 我不明白你在做什么。基本上你的意思是:我有三个班,他们不工作。你想做什么?你观察到的行为和预期的行为是什么?您期望数据源中有一些序列化?类中的序列化?通常序列化发生在文本或二进制文件中。所以我的下一个问题是:什么文件?
  • 嗯,基本上我正在尝试为ResultRequest 类制作一个自定义编辑器。数据源本身可以工作,我只是无法从 ASPX 而不是后面的代码对其进行配置。 TypeConverters 在那里是因为默认序列化(到您的 ASPX XML)不起作用 - f.ex。虽然我知道如何序列化object[],但设计师不知道,所以我打算告诉他这是怎么做的。这也是编辑器的用途。是的,我花了几个小时尝试添加和删除属性,试图了解它是如何工作的(结论:它不起作用,我不明白)。
  • @SimonMourier 所以回答你的问题,是的,我确实尝试过,但我看不出它是如何工作的(毕竟,设计者不知道如何序列化 ResultRequest 数据回来和到 ASPX 文件);据我了解,我需要一个TypeConverter

标签: c# asp.net editor controls datasource


【解决方案1】:

请看一下我的示例,它不太复杂,因此更容易理解:

第一个父控件(在您的情况下,这将是 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; }
    }
}

请注意,我已将 ChildrenAsProperties 设置为 false。这是子定义,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;
        }
    }
}

现在在设计师内部我可以像这样声明 TabContainer:

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

最后添加保留状态的子控件:

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

最好的问候!

【讨论】:

  • 谢谢,但我认为这不是一个真正的解决方案:问题部分在于object[]Type 需要序列化。 IList&lt;T&gt;T 可序列化类型是可序列化的,因此可以与 PersistenceMode 一起使用,而我的示例不能。我在组合所有这些属性和理解如何将它们粘合在一起时遇到了困难……也许如果你让你的例子更复杂一点,它会有可比性?
猜你喜欢
  • 2012-11-04
  • 2015-09-10
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多