C# 在.aspx页的复合控件中设置子控件的属性

C# 在.aspx页的复合控件中设置子控件的属性,c#,asp.net,controls,composite,C#,Asp.net,Controls,Composite,我有一个复合控件(class),它通过get属性公开一个asp:Label可以通过aspx代码设置标签的文本属性吗? 我想这样做: 一种解决方案是将每个属性添加到复合类(如公共LabelText),但我想设置任何子控件的任何属性。因此,随着子控件的新功能变得可用,我希望能够在我的复合控件上使用它们。因此,基本上我想设置已公开子控件的任何属性您需要将其作为复合控件类中的属性公开:- public string LabelText { get { return Label.Text

我有一个复合控件(
class
),它通过get属性公开一个
asp:Label
可以通过aspx代码设置标签的
文本属性吗?

我想这样做:


一种解决方案是将每个属性添加到复合类(如公共LabelText),但我想设置任何子控件的任何属性。因此,随着子控件的新功能变得可用,我希望能够在我的复合控件上使用它们。因此,基本上我想设置已公开子控件的任何属性

您需要将其作为复合控件类中的属性公开:-

public string LabelText
{
  get
  {
    return Label.Text;
  }
  set
  {
    Label.Text = value;
  }
}
然后,您可以从服务器标记控制它,如:-

<cfw:MyCompositeControl runat="server" LabelText="Test" />

您应该公开一个公共属性,该属性返回/设置标签的文本属性。

编辑: 不建议您从页面访问复合控件的所有子控件:

  • 一种方法是通过MyCompositeControl.FindControl(ID)
(或扩展方法)访问子控件。如果要删除控件或更改ID,这种方法非常静态且容易出错
  • 另一种方法是公开子控件,但这也是一种糟糕的设计,因为它为滥用控件打开了大门,如果您想要更改子控件,并且页面已经直接访问它们,那么也会有问题

  • 您可以使用内部属性:

    [ParseChildren(ChildrenAsProperties = true)]
    public partial class MyControl: UserControl
    {
    
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public TestClass TestLabel
        {
             get;set;
        }
    }
    public class TestClass
    {
        public string Field1
        { get; set; }
        public string Field2
        { get; set; }
    }
    
    标记:

    <MyTag:MyControl runat="server">
        <TestLabel Field1="a" Field2="b" />
    </MyTag:MyControl>
    
    
    
    我以前从来没有对简单属性进行过这样的操作-通常,您使用的是集合。在我自己玩这个例子的过程中,在标记窗口中,Visual Studio将允许您在
    内部创建多个
    TestLabel
    实例-也就是说,它似乎并不关心它是一个简单的属性而不是一个集合,我怀疑如果您输入多个条目,只会产生最后一个条目


    仅供参考。。。如果您以前没有这样做过,请准备好被intellisense惹恼。在对类进行更改后,更新行为可能会令人恼火,需要重新编译,并且可能需要等待一些任意的时间,然后它才会按预期的方式运行。

    这就是我目前拥有的。。。但我希望能够设置任何属性,而不仅仅是这个属性。简而言之,你不能对任何属性进行设置。这也不是一个很好的设计。如果您不关心在aspx页面的服务器标签中设置属性,并且只需要代码隐藏支持,那么您可以将整个标签作为属性公开。公开它的全部目的是让我们的应用程序开发人员可以设置他们认为适合设置的所有标签属性。但我们有一个规定,他们不应该使用,只有aspx。现在我的标签是公开的。但是我不能在我的aspx页面上使用它。嗯。。。我以前用ITemplate对象做过类似的事情,但从来没有用过真正的控件。看起来值得一试,这是最好的方法,也提供了最好的灵活性。