Asp.net 将web控件引用传递给用户控件基类

Asp.net 将web控件引用传递给用户控件基类,asp.net,webusercontrol,abstract-base-class,Asp.net,Webusercontrol,Abstract Base Class,我创建了几个用户控件——大多数包含单个web控件(文本框、下拉列表、单选按钮等)——以及一个或多个验证控件。要点是在单个用户控件中组合控件和验证 我为这些用户控件创建了一个基类,它具有一些常见的功能—为单个web控件的多个属性设置器,特别是要在ascx中的控件中设置的CssClass和Style。 例如,一个带有一个必需字段验证器的文本框 基类的示例代码: public WebControl ctrl {get; set;} //allow derived class access to th

我创建了几个用户控件——大多数包含单个web控件(文本框、下拉列表、单选按钮等)——以及一个或多个验证控件。要点是在单个用户控件中组合控件和验证

我为这些用户控件创建了一个基类,它具有一些常见的功能—为单个web控件的多个属性设置器,特别是要在ascx中的控件中设置的CssClass和Style。
例如,一个带有一个必需字段验证器的文本框

基类的示例代码:

public WebControl ctrl {get; set;}  //allow derived class access to this

public string CssClass
{
  set { ctrl.CssClass = value; }    //allow CssClass to be set in the aspx page
}
派生类的示例代码: (在构造函数或控件OnInit事件中-或?)

ascx的示例代码:

<asp:TextBox ID="txt" Cssclass="input-text-m" maxlength="50" runat="server" />
<asp:RequiredFieldValidator ID="val" runat="server" ControlToValidate="txt" 
    ErrorMessage="">*</asp:RequiredFieldValidator>

*
aspx的示例代码:

<uc:TextBox ID="ForeName" Cssclass="input-text-m" maxlength="50" 
ErrorMessage="Forename" runat="server"/>

我发现的问题是,在调用基类属性设置器之前,我找不到让派生类设置基类web控件引用的方法。 如果我在派生类构造函数中设置base.ctrl,那么派生类控件引用(txt)此时仍然为空。 如果我在任何控制事件中设置base.ctrl,例如OnInit,那么就太晚了

到目前为止,我通过简单地不使用基类,而是在用户控件类中编写属性设置器代码来解决这个问题,但是这意味着代码的重复,这是我试图避免的


有没有一种方法可以通知控件的基类我希望它在设置属性之前为它们设置属性-或者我的做法是错误的…

在任何get/set操作之前调用
EnsureChildControls
,并在
EnsureChildControls
中包含ctrl=txt的设置操作?这是普通服务器控件的标准做法,我认为它也适用于用户控件

public string CssClass {   set { EnsureChildControls(); ctrl.CssClass = value; } } 
覆盖
EnsureChildControls
,保留对base的调用,并设置
ctrl=txt在调用base之后


更多信息:

虽然在这种情况下似乎不需要EnsureChildControl(),但您的想法是可行的。重要的一点是覆盖思想,它允许基类属性设置器在需要时直接访问派生类控件——此时,控件引用(txt)不再为空。我在基类中为控件创建了一个虚拟属性,并在派生类中重写它,如下所示:
code
public-virtual-WebControl-ctrl{get;set;}public-override-WebControl-ctrl{get{return txt;}}
code
,效果很好!
public string CssClass {   set { EnsureChildControls(); ctrl.CssClass = value; } }