【问题标题】:Settings properties of a child in a composite control in an .aspx page在 .aspx 页面中的复合控件中设置子项的属性
【发布时间】:2011-02-28 16:49:00
【问题描述】:

我有一个复合控件 (class),它通过 get-property 公开 asp:Label可以通过aspx-code设置Label的Text属性吗?

我想做这样的事情: <cfw:MyCompositeControl runat="server" Label.Text="Test" />

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

【问题讨论】:

    标签: c# asp.net controls composite


    【解决方案1】:

    您可以使用内部属性来做到这一点:

    [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 将允许您在 &lt;MyTag:MyControl&gt; 内创建多个 TestLabel 实例 - 也就是说,它似乎并不关心它是一个简单的属性,而是而不是一个集合,我怀疑如果你输入多个条目,只会产生最后一个条目。

    仅供参考...如果您以前没有这样做过,请准备好被智能感知所激怒。在对类进行更改后更新行为可能会令人讨厌地迟钝,您需要重新编译并且可能等待一段时间才能按预期方式运行。

    【讨论】:

    • 嗯...我以前用 ITemplate 对象做过类似的事情,但从来没有真正控制过。看来值得一试。
    • 这是最好的方法,并提供最好的灵活性。
    【解决方案2】:

    你需要将它作为一个属性暴露在复合控件的类中:-

    public string LabelText
    {
      get
      {
        return Label.Text;
      }
      set
      {
        Label.Text = value;
      }
    }
    

    然后你可以从服务器标签控制它:-

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

    【讨论】:

    • 这是我目前拥有的......但我希望能够设置任何属性,而不仅仅是这个属性。
    • 简而言之,您不能为任何财产这样做。这也不是一个很好的设计。如果您不关心能够在 aspx 页面中的服务器标签中设置属性,并且只需要背后代码的支持,那么您可以将整个 Label 公开为属性。
    • 公开它的全部目的是让我们的应用程序开发人员可以设置他们认为适合设置的所有标签属性。但是我们有一条规则,他们不应该使用 ,只能使用 aspx。
    【解决方案3】:

    您应该公开一个返回/设置标签的 Text 属性的公共属性。 MSDN

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

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

    【讨论】:

    • 此时我的标签是公开的。但我不能在我的 aspx 页面中使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2011-07-28
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多