2012-01-05 47 views
2

我有三个类和一个用户控件将使用这三个类。
这里是类及其解释:为什么我不能在WebForm中声明UserControl的子元素(属性)?

//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标签识别为内部标签,但它不能识别实际为ManagementMethod的Method标签的类型。当我将任何属性的类型更改为简单类型时,例如将List更改为ManagementMethod,ASP.net就会识别它并且一切正常。您也可以使用任何列表<>对象。

回答

2

下面是从我们的生产代码片段,您可以看到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> 

我相信这也可能离开指定肠子内容属于默认特定属性,看PersistenceMode.InnerDefaultProperty - 但我从来没有试过这种。

+0

呀!我第一次提到这件事。感谢代码,但仍然有相同的问题!仍然说名称不是元素Method的正确属性。 – jim 2012-01-06 12:23:13

+0

@RichardFriend这是一个很好的答案,并且(不幸地)被严重低估了,非常感谢我的+1。 – atlaste 2013-04-17 10:08:44

相关问题