我创建了一些从文本框继承的自定义文本框。对于下一步,我想用包装器注册 javascript。
装饰器模式允许我这样做,只要我可以从文本框继承它并将自定义文本框作为构造函数参数传递。
问题是当我将控件添加到 aspx 页面时如何使用构造函数,或者基本上如何将装饰器模式用于 asp.net 控件。
编辑:
简单来说,这是我的验证基类(IField 是一个验证接口。可以忽略):
public abstract class ValidationBase : TextBox, IField
{
private readonly IField _field;
protected ValidationBase(IField field)
{
_field = field;
}
public int MinLength
{
get { return _field.MinLength; }
set { _field.MinLength = value; }
}
public bool Required
{
get { return _field.Required; }
set { _field.Required = value; }
}
// other porperties etc...
protected override void OnPreRender(EventArgs e)
{
// DO SOME STUFF...
base.OnPreRender(e);
}
}
这是我的具体课程(EmailField 是 IField 忽略的具体实现...):
public class ValidationEmail : ValidationBase
{
public ValidationEmail()
: base(new EmailField(string.Empty))
{
}
}
最后我想实现这个(我已经在写字板上下定了决心,这不能是确切的实现。):
public class JsRegisterDecorator : ValidationBase
{
private readonly ValidationBase _validationObj;
//I am not quite sure about the constructor but i can handle
public JsRegisterDecorator(ValidationBase concreteValidationObj)
: base(concreteValidationObj)
{
_validationObj = concreteValidationObj;
}
//Wrap the properties
protected override void OnPreRender(EventArgs e)
{
//Register JS Files...
_validationObj.OnPreRender(e);
}
}
问题是我该如何使用这个装饰器?因为asp.net自动构造控件:
<vc:ValidationEmail ID="ValidationEmail1" runat="server"/>
我不知道我可以使用这个(我可以将构造函数参数放在哪里?):
<vc:JsRegisterDecorator ID="ValidationEmailWithJs1" runat="server"/>