为什么可以';t我在WebForm中声明UserControl的子元素(属性)

本文关键字:UserControl 声明 元素 属性 WebForm 我在 为什么 | 更新日期: 2023-09-27 18:19:27

我有三个类和一个将使用这三个类的用户控件
以下是类及其解释:

//provides access to multiple ManagementMethods
[Serializable(), ParseChildren(true)]
public class ManagementDelegate
{
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
     PersistenceMode(PersistenceMode.InnerProperty)]
     public List<ManagementMethod> Method
     {
         get; set;
     }
}
//provides access to multiple ManagementParameters and the method name
[Serializable(), PersistChildren(false)]
public class ManagementMethod
{
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
     public string Name
     {
         get; set;
     }
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
     PersistenceMode(PersistenceMode.InnerProperty)]
     public List<ManagementParameter> Parameter
     {
         get; set;
     }
}
//describes a parameter of method.
[Serializable(), PersistChildren(false)]
public class ManagementParameter
{
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
     public string ParameterName
     {
         get; set;
     }
}
//===============================
//here is the part of user control code behind that uses the ManagementDelegate class.
[Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
PersistenceMode(PersistenceMode.InnerProperty)]
public ManagementDelegate SelectMethods
{
    get; set;
}

这里有一个我正在寻找的结构示例:

<UC:MyUc ID="test" runat="server">
    <SelectMethods>
        <!-- here when i open a tag asp.net lists the Method, but when i try to set the Name attribute it warns and won't run. -->
        <Method Name="meth">
            <Parameter ParameterName="id" />
            <Parameter ParameterName="word" />
        </Method
        <Method Name="meth2">
        </Method
    </SelectMethods>
</UC:MyUc>

问题是ASP.net将SelectMethod识别为内部标记,它甚至将Method标记识别为内部标签,但它不识别Method标记的类型,实际上是ManagementMethod。当我将任何属性的类型更改为简单类型时,例如,将List更改为仅ManagementMethod,ASP.net就会识别它,并且一切正常。任何列表<>也是如此对象

为什么可以';t我在WebForm中声明UserControl的子元素(属性)

这是我们生产代码的一个片段,您可以看到ControlDependency类甚至允许ControlDependency 的子级

[PersistChildren(false), TypeConverter(typeof(ExpandableObjectConverter)), ParseChildren(true), Serializable()]
    public class ControlDependencySetting
    {
        [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content),
            PersistenceMode(PersistenceMode.InnerProperty)]
        public List<ControlDependency> ControlDependencies { get; set; }
        ***Code emitted
    }
[PersistChildren(false), TypeConverter(typeof(ExpandableObjectConverter)), ParseChildren(true),Serializable()]
    public class ControlDependency
    {
        [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content), 
            PersistenceMode(PersistenceMode.InnerProperty)]
        public List<ControlDependency> ControlDependencies { get; set; }
       **Code Emitted
    }

并在自定义控件中声明为

[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content),
    PersistenceMode(PersistenceMode.InnerProperty),
    NotifyParentProperty(true)]
    public List<ControlDependencySetting> ControlDependencySettings { get; set; }

还要注意,我确实在每个构造函数中创建了这些列表的一个实例。

*编辑***

您已经调用了列表Method和元素Method,您希望ManagementDelegate的子元素自动添加到名为Method的列表中,这不是它的工作方式,当您想添加到列表中时,您需要指定列表元素并添加到其中,您对参数也做了同样的操作。

这是您当前结构所期望的

<SelectMethods> 
  <Method> <--Now this is the list of methods, you have also called it method        
      <Method Name="meth"> <-- This is an element of the method type to add to the list you have called Method
            <Parameter> <-- This is the list of parameters you have called it Parameter
                <Parameter ParameterName="id" />   <--parameter element             
                <Parameter ParameterName="word" />                
            <Parameter>
      </Method>
  </Method>

您应该重命名为MethodsParameters,并相应地使用或重新构建布局。

类似的东西

    //provides access to multiple ManagementMethods
[Serializable(), ParseChildren(true)]
public class ManagementDelegate
{
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
     PersistenceMode(PersistenceMode.InnerProperty)]
     public List<ManagementMethod> Methods
     {
         get; set;
     }
}
//provides access to multiple ManagementParameters and the method name
[Serializable(), PersistChildren(false),TypeConverter(typeof(ExpandableObjectConverter))]
public class ManagementMethod
{
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
     public string Name
     {
         get; set;
     }
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
     PersistenceMode(PersistenceMode.InnerProperty)]
     public List<ManagementParameter> Parameters
     {
         get; set;
     }
}
//describes a parameter of method.
[Serializable(), PersistChildren(false),TypeConverter(typeof(ExpandableObjectConverter))]
public class ManagementParameter
{
     [Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
     public string ParameterName
     {
         get; set;
     }
}
//===============================
//here is the part of user control code behind that uses the ManagementDelegate class.
[Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
PersistenceMode(PersistenceMode.InnerProperty)]
public ManagementDelegate SelectDelegate
{
    get; set;
}

然后

<UC:MyUc ID="test" runat="server">
    <SelectDelegate>
       <Methods>
          <Method Name="meth">
            <Parameters>
                <Parameter ParameterName="id" />
                <Parameter ParameterName="word" />
            <Parameters>
          </Method>
          <Method Name="meth2">
          </Method>
        </Methods>
    </SelectDelegate>
</UC:MyUc>

我相信也可以指定innner内容默认属于特定属性,请参阅PersistenceMode.InnerDefaultProperty,但我从未尝试过。