【发布时间】:2010-04-16 14:25:38
【问题描述】:
我有一组自定义的 ASP.NET 服务器控件,其中大部分都派生自 CompositeControl。我想通过将每个控件包装在特定的 HTML/CSS 标记中来实现跨所有控件类型的“必需”字段的统一外观。例如:
<div class="requiredInputContainer">
...custom control markup...
</div>
我很想以这样一种方式抽象这种行为,以避免在现在和未来的每个自定义控件中都必须做这样丑陋的事情:
public class MyServerControl : TextBox, IRequirableField {
public IRequirableField.IsRequired {get;set;}
protected override void Render(HtmlTextWriter writer){
RequiredFieldHelper.RenderBeginTag(this, writer)
//render custom control markup
RequiredFieldHelper.RenderEndTag(this, writer)
}
}
public static class RequiredFieldHelper{
public static void RenderBeginTag(IRequirableField field, HtmlTextWriter writer){
//check field.IsRequired, render based on its values
}
public static void RenderEndTag(IRequirableField field, HtmlTextWriter writer){
//check field.IsRequired , render based on its values
}
}
如果我是从同一个基类派生所有自定义控件,我可以想象使用模板方法来强制执行前后行为;但我有几个基类,我宁愿无论如何,最终不会得到真正复杂的类层次结构。
感觉我应该能够通过利用 C# 的功能方面来设计更优雅的东西(即遵守 DRY 和 OCP),但我正在画一个空白。
【问题讨论】:
标签: asp.net abstraction custom-server-controls functional-programming