【发布时间】:2010-11-08 05:33:14
【问题描述】:
在编写自定义控件时,它总是呈现为 HTML span 元素。 例如,如何将其更改为 div?
【问题讨论】:
标签: asp.net custom-controls custom-server-controls
在编写自定义控件时,它总是呈现为 HTML span 元素。 例如,如何将其更改为 div?
【问题讨论】:
标签: asp.net custom-controls custom-server-controls
如果您从 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 只是为了让输出更容易被发现。
【讨论】:
我通常有自己的基类,我的所有复合控件都继承自该基类。我添加的属性之一是 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; }
}
【讨论】:
从 WebControl 派生您的控件,如下所示:
public class MyCustomControl : WebControl {
public MyCustomControl() : base(HtmlTextWriterTag.Div) {}
}
即使用接受要使用的标签的基类构造函数。
【讨论】: