我创建了几个用户控件——大多数包含一个 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 - 那么这为时已晚。
到目前为止,我已经解决了这个问题,只是不使用基类,而是在用户控件类中编写属性设置器代码,但这意味着代码重复,这是我试图避免的。
有没有办法通知控件的基类我希望它在设置属性之前设置它们 - 或者我是否以错误的方式处理事情......