【发布时间】:2011-12-21 04:14:44
【问题描述】:
我创建了几个用户控件——大多数都包含一个 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 事件中 - 或?)
base.ctrl = txt; //tell the base class which web control to apply common properties to.
public string ErrorMessage
{
set { val.ErrorMessage = value;} //this works !
}
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 - 那么这为时已晚。
到目前为止,我通过简单地不使用基类,而是在用户控件类中编写属性设置器代码来解决这个问题,但这意味着代码重复,这是我试图避免的。
有没有办法通知控件的基类,我希望它在设置属性之前设置它们的属性 - 或者我是否以错误的方式处理事情......
【问题讨论】:
标签: asp.net webusercontrol abstract-base-class