编写自定义控件时,它始终呈现为HTML span元素。 如何将其更改为例如div?
答案 0 :(得分:7)
从WebControl导出您的控件,如下所示:
public class MyCustomControl : WebControl {
public MyCustomControl() : base(HtmlTextWriterTag.Div) {}
}
即,使用接受要使用的标记的基类构造函数。
答案 1 :(得分: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">
这正是我对我的这个特定复合控件所需要的,一个带有一个包装ReportViewer控件的类的div。我包含ID只是为了让输出更容易被发现。
答案 2 :(得分: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; }
}