Asp.net 如何将自定义控件的渲染行为从范围更改为范围

Asp.net 如何将自定义控件的渲染行为从范围更改为范围,asp.net,custom-controls,custom-server-controls,Asp.net,Custom Controls,Custom Server Controls,编写自定义控件时,它始终呈现为HTML span元素。 例如,如何将其更改为div?从WebControl派生控件,如下所示: public class MyCustomControl : WebControl { public MyCustomControl() : base(HtmlTextWriterTag.Div) {} } 也就是说,使用接受要使用的标记的基类构造函数。我通常有自己的基类,所有复合控件都从中继承。我添加到其中的一个属性是ContainerElement。公开公

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

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

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

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

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

您只需要设置HTMLContainerElement,它将获得HtmlTextWriterTag枚举中所有项的inteli帮助

/// <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; }
}
//
///用于存储呈现控件的容器元素的局部变量。
/// 
私有HtmlTextWriterTag hosTagKey=HtmlTextWriterTag.Span;
/// 
///HTMLContanerElement是用于设置标记中显示的控件外部html控件的标记键。
///默认值为span,但您可以将其更改为您选择的任何HTML控件。
/// 
公共HtmlTextWriterTag HTMLContainerElement
{
获取{返回this.hosTagKey;}
设置{this.hosTagKey=value;}
}
/// 
///使此控件成为“div”元素,而不是
///标准“跨度”元素。
/// 
受保护的覆盖HtmlTextWriterTag标记键
{
获取{返回this.hosTagKey;}
}

如果从CompositeControl派生,则没有采用标记类型的构造函数。您可以覆盖TagKey(我还没有尝试过),但更灵活的选择是覆盖RenderBeginTag方法,并使其执行您想要的操作。基类呈现一个“span”开头元素,但不必调用基类方法。如果不希望渲染任何内容,则不必调用任何内容(在这种情况下,还可以覆盖renderndtag,并且也不在那里调用任何内容)。比如说,

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只是为了更容易发现输出