【发布时间】:2013-04-28 19:36:10
【问题描述】:
我创建了一些从文本框继承的自定义文本框。 对于下一步,我想使用包装器注册 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"/>
【问题讨论】:
-
您能否详细说明您的具体情况?将装饰器模式应用于控件,您想实现什么,您尝试过或尝试过什么?
-
@AlexanderManekovskiy 感谢您的评论。我已经更新了我的问题。
标签: c# asp.net user-controls decorator