为什么可以';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就会识别它,并且一切正常。任何列表<>也是如此对象
这是我们生产代码的一个片段,您可以看到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>
您应该重命名为Methods
和Parameters
,并相应地使用或重新构建布局。
类似的东西
//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,但我从未尝试过。