8

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

4

3 回答 3

8

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

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

也就是说,使用接受要使用的标记的基类构造函数。

于 2009-07-05T16:11:47.680 回答
3

如果您从 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 只是为了使输出更容易被发现。

于 2013-08-07T21:04:12.613 回答
0

我通常有自己的基类,我的所有复合控件都继承自该基类。我添加的属性之一是 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; }
}
于 2013-04-17T09:05:00.383 回答