Invoking code both before and after WebControl.Render method
- by Dirk
I have a set of custom ASP.NET server controls, most of which derive from CompositeControl. I want to implement a uniform look for "required" fields across all control types by wrapping each control in a specific piece of HTML/CSS markup. For example:
<div class="requiredInputContainer">
...custom control markup...
</div>
I'd love to abstract this behavior in such a way as to avoid having to do something ugly like this in every custom control, present and future:
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
}
}
If I was deriving all of my custom controls from the same base class, I could conceivably use Template Method to enforce the before/after behavior;but I have several base classes and I'd rather not end up with really a convoluted class hierarchy anyway.
It feels like I should be able to design something more elegant (i.e. adheres to DRY and OCP) by leveraging the functional aspects of C#, but I'm drawing a blank.