C# 重写自定义控件中的控件属性是个坏主意吗?

C# 重写自定义控件中的控件属性是个坏主意吗?,c#,asp.net,custom-controls,overriding,C#,Asp.net,Custom Controls,Overriding,我正在尝试创建一个web partish自定义控件。我将使用Mono,所以不,我不能只使用ASP.Net(这是我们决定使用Mono之前使用的) 基本上,我们希望有一个名为WebPart的自定义控件,它是web部件派生的抽象类 在WebPart类中,我希望它基本上只包含标题和内容(两者都能够应用样式表) 现在,我基本上只是在WebPart构造函数中,在控件的位置0处添加了一个标签和面板,以便呈现标题(标签放在面板中)。现在,我的问题来了。没有一种简单的方法可以包含Web部件的内容(对于派生控件来说

我正在尝试创建一个web partish自定义控件。我将使用Mono,所以不,我不能只使用ASP.Net(这是我们决定使用Mono之前使用的)

基本上,我们希望有一个名为
WebPart
的自定义控件,它是web部件派生的抽象类

WebPart
类中,我希望它基本上只包含标题和内容(两者都能够应用样式表)

现在,我基本上只是在
WebPart
构造函数中,在控件的位置0处添加了一个标签和面板,以便呈现标题(标签放在面板中)。现在,我的问题来了。没有一种简单的方法可以包含Web部件的内容(对于派生控件来说,它只是普通标记之类的),这样我就可以将样式类分别应用于派生控件的内容和标题

我看到的唯一解决方案是为标题和内容设置一个
面板,然后覆盖
WebPart.Controls
,这样
Controls=pnlContent.Controls

这意味着什么?这会弄乱UniqueID或javascript吗?有没有更好的办法?对于自定义控件,这是正常的操作吗

重写自定义控件的
控件
索引器
指向另一个控件的
控件
属性会遇到什么问题

我提议的课程是这样的(简化了很多)


另外,由于我隐藏了base.Controls属性,ASP.Net在呈现此属性时会出现问题吗?(因此,它只会呈现
pnlContent.Controls
而不会呈现
this.Controls
?)

我认为最大的问题是释放资源。从MSDN:

释放所使用的非托管资源 由控件及其子控件创建 并且可以选择释放托管 资源


所以,如果你不照顾好自己,你可能会泄漏内存。除此之外,我不认为还有太多其他问题需要担心。

根据你的评论,你难道不能写这样的东西吗(我不知道Mono,所以如果这完全是胡说八道的话,就忽略它——在ASP.net中,我也会这样写)

这只是演示了如何将css类单独添加到复合服务器控件中。基本上,您只需将属性的设置传播到子控件

我不知道你到底想达到什么目标,但你应该看看这门课


对于您关于覆盖控件集合的问题:当我创建自定义服务器控件时,更改的可能性较小。服务器控件必须在许多不同的情况下工作,嵌套在usercontrols中,可能嵌套在其他模板控件中。这可能会很快导致奇怪的副作用,这些副作用很难跟踪。在UI开发的标准化过程中,我已经创建了一系列控件,而且我从来没有覆盖过WebControl甚至控件的基本属性。作文大部分时间都很好。

这并不能真正回答问题。。但是我们只是重写RenderControl来呈现一些额外的内容,而不是试图重写Controls方法。似乎覆盖控件的工作一直持续到onchange事件和viewstate

你能进一步解释一下吗?“没有简单的方法来包含Web部件的内容(它将只是普通的标记,并且类似于派生控件),这样我就可以将样式类分别应用于派生控件的内容和标题。”基本上,这样我就可以执行类似于
lblTitle.CssClass=“foo”
pnlContent.CssClass=“bar”的操作
是,但使用此选项,每当您创建从此控件派生的新控件时,新控件的标记(内容)最终不会进入
panelContent
。因此,您无法控制所创建控件的CSS。而且,ASP.Net只是在一个框架上运行的东西。它在Mono和微软的.Net.Hmm上都能工作……但是如果你用模板而不是面板,它就会工作,对吗?我不确定我是否得到了你真正想要的这个WebPart控件。但是如果你想让它成为s.t.所有的控件都有一个标题+内容,那么它应该和一个模板控件一起工作。基本上,您的子控件只分配在“basecontrol”内容区域中实例化的模板。
abstract class WebPart{
  protected lblTitle=new Label();
  protected pnlContent=new Panel();
  public ControlCollection Controls{
    get{
      return pnlContent.Controls;
    }
  }
  public WebPart(){
    base.Controls.Add(lblTitle);
    base.Controls.Add(pnlContent);
  }
}
public class MyCustomServerControl : CompositeControl
{
   private Label labelTitle;
   private Panel panelContent;

   public override CreateChildControls()
   {
      base.Controls.Clear();

      labelTitle = new Label();
      labelTitle.ID = "lblTitle";

      panelContent = new Panel();
      panelContent.ID = "pnlContent";


      this.Controls.Add(labelTitle);
      this.Controls.Add(panelContent);
   }

   [Browsable(true)]
   public string LabelCssClass
   {
      get 
      {
         EnsureChildControls();
         return labelTitle.CssClass; 
      }
      set 
      { 
         EnsureChildControls();
         labelTitle.CssClass = value; 
      }
   }

   [Browsable(true)]
   public string PanelContentCssClass
   {
      get 
      {
         EnsureChildControls();
         return panelContent.CssClass; 
      }
      set 
      { 
         EnsureChildControls();
         panelContent.CssClass = value; 
      }
   }
   ... 
}