是否可以使自定义控件的TagName与Control的ClassName不同?

时间:2014-04-10 21:32:40

标签: asp.net controls custom-controls naming custom-attributes

我正在构建我的第一个ASP.net自定义控件,并且我尝试使用ToolboxDataAttribute来设置控件的初始标记。

到目前为止,我所看到的是,您无法为控件选择任何所需的标记名称,因为它应该与您的控件的className匹配才能生效。在这个例子中,我有一个MyControl' class并使用ToolboxDataAttribute设置自定义TagName:

[DefaultProperty("Text")]
[ToolboxData("<{0}:MyCustomTagName runat=server></{0}:MyCustomTagName>")]
public class MyControl : WebControl
{
}

当我尝试在项目中使用此自定义控件时,我将其从工具箱中拖放,并将其呈现为:

<%@ Register assembly="TestCustomControl" namespace="TestCustomControl" tagprefix="cc1" %>
...
<cc1:MyCustomTagName ID="MyCustomTagName1" runat="server"></cc1:MyCustomTagName>

但是当我尝试运行它时,项目一直告诉我: MyCustomTagName不是已知元素,我无法构建它。

我已经玩了一下,并意识到如果我将TagName更改为控件的ClassName,控件仍然有效,所以以下工作:

<cc1:MyControl ID="MyCustomTagName1" runat="server"></cc1:MyControl>

所以我的问题是:

如果你不能改变你的控件的tagName,那么ToolboxDataAttribute有什么意义?我可以想象它可能是从一开始就添加更多标记,但后来我想知道如果我可以拥有TagName与控件的ClassName不匹配的场景。

我已经尝试将TagName属性添加到@Register指令中,但是如果我这样做,那么它会要求Src属性,因为这属于用户控制语法而不是自定义控件语法。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

正如您所怀疑的那样,ToolboxData属性的主要用途是为控件的默认值提供额外的标记。来自MSDN

  

要指定初始默认值,控件可以使用此值   属性。您可以使用此属性来自定义初始HTML   拖动控件时放置在设计器中的内容   从工具箱到表格。

对于自定义控件,只能自定义标记前缀,并将其注册为与程序集中的命名空间相关。通过使用类名作为标记名来标识控件本身。您无法为用户控件更改此设置。

我同意您的看法,ToolboxData属性的设计会在您指定包含标记名称的完整标记时尝试更改标记名称 - 尽管标记前缀有占位符。如果标签名称也有占位符,那将更加清晰。当您更改自定义控件的类名并忘记更改ToolboxData属性中的字符串时,这也可以避免错误。