【问题标题】:Invoking code both before and after WebControl.Render method在 WebControl.Render 方法之前和之后调用代码
【发布时间】: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


    【解决方案1】:

    您有一个可选行为,您想将其添加到某些对象而不是其他对象。这意味着您的问题中有Proxy 模式。创建一个控件,该控件是其他控件的容器,并在呈现其任何子项之前和之后执行您所需的操作。

    你不想继承专精是对的。继承以创建抽象和变体。委托进行专业化。

    编辑

    /// <summary>
    /// Create one of these panels for each required control
    /// then place the required control into it
    /// </summary>
    public class ContainerForRequiredControls : Panel
    {
      protected override void Render(HtmlTextWriter writer)
      {
        writer.Write("<!-- header -->");
    
        RenderChildren(writer);
    
        writer.Write("<!-- footer -->");
      }
    }
    

    【讨论】:

    • Max,通过委托代理似乎是在这里应用的正确模式。不幸的是,我想要代理的方法 WebControl.Render 被声明为“受保护的内部”。鉴于此,我不知道如何让直接授权工作。想法?
    • @Dirk:我相信渲染孩子是基类(Control's)渲染行为的一部分,对吧?因此,在实例化时,将代理对象添加到控件的 Controls 集合中。然后在你的渲染方法中做你的标题工作,调用基本渲染,然后做页脚工作。那不行吗?
    • 它似乎不起作用;至少在不修改我的一些自定义控件的内部结构的情况下是这样。
    • @Dirk:今晚我会拿出一个样本。
    • @Max:期待看到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多