我创建基于ScriptControl的控制,而我重写Render
方法是这样的:确保为元素的唯一ID属性中ScriptControl的
protected override void Render(HtmlTextWriter writer)
{
RenderBeginTag(writer);
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.Write("This is a test.");
writer.RenderEndTag();
RenderEndTag(writer);
}
我的问题是,如果我想分配什么div ID属性并使其在页面上是唯一的,即使有我的控件的多个实例?
我见过别人的代码,这是否:
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest");
这将阻止我控制的实例之间的命名冲突,但如果我已经是巧合有在页面上创建一个div别处相同的ID?
我也听说过实施INamingContainer。这适用于这里吗?我怎么用它?
UPDATE:
我解决此通过重写CreateChildControls
和增加实际控制,而不是直接渲染HTML工作。在那种情况下,INamingContainer会完成它的工作。不过,我仍然好奇是否有办法解决我原来的问题(直接渲染元素的唯一ID)。
我实现了INamingContainer并尝试添加一个ID属性: writer.AddAttribute(HtmlTextWriterAttribute.Id,“divTest”); 但是当我实例化我的两个控件时,div在两个中都有相同的ID。也许这是因为div不是儿童控制。 MSDN说:“所有的孩子控制ID属性保证是唯一的。” – 2010-04-28 05:42:16
你是如何实例化的?如果我在同一个页面上有两个文本框,并且具有相同的ID,那将是一个命名冲突。如果我在ID为TextBox1的页面上有一个texbox,而在嵌套的用户控件(WebUserControl1)中有一个id为TextBox1,则生成的id保证是唯一的 - TextBox1和WebUserControl1_TextBox1 – 2010-04-28 12:23:41
我将两个带有不同ID的ScriptControl添加到页面使用设计器(拖放)。每个渲染的div都带有相同的ID。问题是我没有向用户控件添加子控件;我使用TextWriter手动渲染服务器控件中的div。 – 2010-04-28 14:06:50