【问题标题】:How Do I Change the render behavior of my custom control from being a span如何将自定义控件的呈现行为从跨度更改为
【发布时间】:2010-11-08 05:33:14
【问题描述】:

在编写自定义控件时,它总是呈现为 HTML span 元素。 例如,如何将其更改为 div?

【问题讨论】:

    标签: asp.net custom-controls custom-server-controls


    【解决方案1】:

    如果您从 CompositeControl 派生,则没有采用标记类型的构造函数。你可以重写 TagKey(我没试过),但更灵活的选择是重写 RenderBeginTag 方法,让它做你想做的事。基类呈现一个“span”打开元素,但您不必调用基类方法。如果您不想渲染任何内容,则无需调用任何内容(在这种情况下,还要覆盖 RenderEndTag 并且也不在那里调用任何内容)。例如,

    public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "reportViewer");
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "QueryViewerWrapper");
            writer.RenderBeginTag(HtmlTextWriterTag.Div); 
        }
    

    这段代码产生

    <div class="reportViewer" id="QueryViewerWrapper">
    

    这正是我的这个特殊复合控件所需要的,一个带有类的 div 来包装 ReportViewer 控件。我包含 ID 只是为了让输出更容易被发现。

    【讨论】:

      【解决方案2】:

      我通常有自己的基类,我的所有复合控件都继承自该基类。我添加的属性之一是 ContainerElement。公开展示,开发人员可以选择他们想要的任何外部元素。在内部,它设置了 TagKey 属性,该属性控制基本控件上的此呈现。将以下所有内容添加到您的控件/基类中。

      您只需要设置 HTMLContainerElement ,它将具有 HtmlTextWriterTag 枚举中所有项目的 inteli-help。

      /// <summary>
      /// Local variable for storing what the container element for the rendered control will be.
      /// </summary>
      private HtmlTextWriterTag hosTagKey = HtmlTextWriterTag.Span;
      
      /// <summary>
      /// HTMLContanerElement is the tag key used to set the controls outer html control which appears in the markup.
      /// The default is a span, but you can change this to be any HTML control you choose.
      /// </summary>
      public HtmlTextWriterTag HTMLContainerElement
      {
        get { return this.hosTagKey; }
        set { this.hosTagKey = value; }
      }
      
      /// <summary>
      /// Makes it so this control is a "div" element instead of the
      /// standard "span" element.
      /// </summary>
      protected override HtmlTextWriterTag TagKey
      {
        get { return this.hosTagKey; }
      }
      

      【讨论】:

        【解决方案3】:

        从 WebControl 派生您的控件,如下所示:

        public class MyCustomControl : WebControl {
            public MyCustomControl() : base(HtmlTextWriterTag.Div) {}
        }
        

        即使用接受要使用的标签的基类构造函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-03
          • 2011-11-24
          • 2020-05-31
          • 2020-12-11
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          相关资源
          最近更新 更多